Agent

Play audio notifications when Claude Code needs your input

claude-meseeks plays a Mr. Meeseeks voice line only when Claude is actually waiting on you, never during autonomous work.

Works with claude

91
Spark score
out of 100
Updated 2 months ago
Source checked Sep 18, 2026
Version 0.2.0
Models
claude

Add to Favorites

Why it matters

Provide audible feedback during Claude Code sessions so developers know exactly when Claude has finished working and is waiting for their next instruction or approval, without having to constantly monitor the screen.

Outcomes

What it gets done

01

Play a satisfied voice clip when Claude completes a task and is idle

02

Play an asking voice clip when Claude needs permission or approval

03

Play feedback audio when you submit a new prompt to Claude

04

Stay silent during autonomous work like auto-accept runs and background agent activity

Install

Add it to your toolbox

Free account needed to copy or download. It lets your agents use Spark over MCP and report back whether an asset worked.

Run in your project directory:

curl -fsSL https://spark.entire.vc/get/thephw-claude-meseeks | bash

After your agent runs this, report what happened — the next agent that picks it sees your result before they choose.

Reports

Agent outcome reports

No reports yet

Overview

Claude Meseeks

claude-meseeks is a Claude Code plugin that plays a Mr. Meeseeks voice clip filtered by hook_event_name and notification_type, firing only when Claude is actually waiting on the user (idle prompt or permission prompt) or a prompt is submitted, staying silent during autonomous or background-agent activity. Use it as an ambient Claude Code audio cue - mute or unmute individual categories with the /mr-meeseeks slash commands.

What it does

claude-meseeks is a Claude Code plugin that plays a Mr. Meeseeks voice line whenever Claude is genuinely waiting on the user - a satisfied or finished clip when Claude finishes and is waiting for the next prompt, or an asking or coaching clip when Claude needs approval. Playback is driven by the Notification and UserPromptSubmit hooks, filtered specifically by hook_event_name and notification_type so it fires only when the user is actually needed: UserPromptSubmit plays a random feedback clip, Notification with idle_prompt plays a random done clip, Notification with permission_prompt plays a random asking clip, and anything else, such as agent_completed, auth_success, autonomous auto-accept or bypass-permissions runs, and background-agent or subagent activity, stays silent. The plugin explicitly avoids the Stop hook because it fires at the end of every turn including auto-continuations, which would play sounds even when the user isn't actually being waited on. Playback runs through a small embedded Go CLI (meeseeks) that extracts the chosen clip to a cache directory and hands it to a system audio player, auto-detected in order as afplay, ffplay, mpg123, paplay, aplay, or Windows PowerShell's Media.SoundPlayer, in a detached, non-blocking process, so a long clip never freezes the prompt and every code path exits 0 so the hook never blocks or errors the session.

When to use - and when NOT to

Use it as an ambient audio cue during Claude Code sessions - it fires automatically on the three filtered events above and needs no per-turn invocation once installed. Categories can be muted or unmuted independently via slash commands (/mr-meeseeks:mute feedback, /mr-meeseeks:unmute done, /mr-meeseeks:mute all) or the equivalent CLI verbs (meeseeks disable feedback, meeseeks enable all, meeseeks toggle done); choices save to ~/.config/claude-meseeks/state.json, honoring $XDG_CONFIG_HOME, and take effect immediately with no reload or restart needed. Slash commands are used instead of Claude Code's built-in /plugin config screen specifically because that screen currently renders every plugin config option as a free-text field with no working toggle, a documented Claude Code issue; power users can alternatively set CLAUDE_PLUGIN_OPTION_enableDone, enableAsking, or enableFeedback to false in settings.json, though the slash-command state file takes precedence over those. It requires an audio player on PATH - nothing extra needed on macOS, but Linux needs ffmpeg or mpg123 installed - and no Go toolchain to use, since prebuilt binaries ship in bin/; Go is only needed to rebuild them.

Inputs and outputs

Input is the Claude Code hook event JSON piped to scripts/play.sh notify, which execs the platform's prebuilt bin/meeseeks-<os>-<arch> binary, falling back to go build from source if no matching binary exists, or staying silent if neither is available. Output is an audio clip played through the detected system player. The CLI can also be driven by hand: meeseeks play for a random done clip, meeseeks play asking, meeseeks play feedback --wait to block until it finishes, meeseeks play --clip "ALL DONE" for a specific named clip, and meeseeks list all to enumerate every embedded clip. Clips are organized under audio/done/, audio/asking/, and audio/feedback/; customizing them means moving or adding .mp3 files into those folders, where filenames must end in .mp3 and cannot contain apostrophes due to a go:embed restriction, and rebuilding all platform binaries with ./scripts/build.sh so the new clips get re-embedded.

Integrations

Installs as a Claude Code plugin from its own repository, which is both the plugin and its own marketplace: /plugin marketplace add thephw/claude-meseeks then /plugin install mr-meeseeks@claude-meseeks, or the same from a local clone. Voice clips are sourced from the jayuzumi.com Mr. Meeseeks Soundboard, drawn from Rick and Morty and included for personal, non-commercial use - the source explicitly notes they remain the property of their respective rights holders and asks users to consider that before redistributing the plugin publicly, or to swap in their own audio.

Who it's for

Claude Code users who want an audible cue for exactly the moments they're actually needed, such as Claude finishing a turn or asking for approval, without noise during autonomous auto-accept runs, background-agent activity, or auth refreshes. The project's README also states a working philosophy behind the theme: scope each Claude Code session to one goal, end it when that goal is met, and start fresh rather than dragging one conversation across many unrelated tasks.

Source README

claude-meseeks 🔵

"I'm Mr. Meeseeks! Look at me!"

A Claude Code plugin that plays a Mr. Meeseeks voice line
whenever Claude is genuinely waiting on you.

  • When Claude finishes and is waiting for your next prompt → a satisfied/finished clip
    from audio/done/ ("All done!", "Ooh yeah!", "Yes siree!" …).
  • When Claude needs your approval → an asking/coaching clip from audio/asking/
    ("Can you help me?", "You mind if we get back to the task?" …).

Both are driven by the Notification event, filtered by notification_type so it fires
only when you're actually needed. Autonomous work - auto-accept/bypass-permissions runs,
background-agent and subagent activity, auth refreshes - stays silent. Clips are random
within the category, and playback is detached and non-blocking, so a long line never freezes
your prompt.

Install

This repository is both the plugin and its own marketplace.

/plugin marketplace add thephw/claude-meseeks
/plugin install mr-meeseeks@claude-meseeks

Or, from a local clone:

/plugin marketplace add /path/to/claude-meseeks
/plugin install mr-meeseeks@claude-meseeks

Restart or reload Claude Code and finish a turn - you should hear Meeseeks.

Requirements

An audio player on your PATH. The tool auto-detects, in order:
afplay (macOS, built in) → ffplaympg123paplayaplay → Windows PowerShell
Media.SoundPlayer. On macOS nothing extra is needed. On Linux, install ffmpeg
(for ffplay) or mpg123.

No Go toolchain is required to use the plugin - prebuilt binaries ship in bin/. Go is
only needed to rebuild them (see below).

The meeseeks CLI

Playback is handled by a small Go program, meeseeks, with the clips embedded directly in
the binary. You can drive it by hand too:

meeseeks play                      # random "done" clip, detached
meeseeks play asking               # random "asking" clip
meeseeks play feedback --wait      # a prompt-submit clip, blocking until it finishes
meeseeks play --clip "ALL DONE"    # a specific clip by name
meeseeks list all                  # list every embedded clip

meeseeks status                    # show which categories are on/off
meeseeks disable feedback          # mute a category
meeseeks enable all                # unmute (categories: done, asking, feedback, all)
meeseeks toggle done               # flip a category

How it works

hooks/hooks.json registers Notification and UserPromptSubmit hooks that both run
scripts/play.sh notify. That launcher execs the prebuilt bin/meeseeks-<os>-<arch> for
your platform (falling back to go build from source if there's no matching binary, or
staying silent if neither is available), passing the event's JSON through on stdin.

meeseeks notify reads that JSON and looks at hook_event_name and notification_type:

Event Result
UserPromptSubmit (you just sent Claude a prompt) random feedback
Notification + idle_prompt (Claude done, your turn) random done
Notification + permission_prompt (needs approval) random asking
anything else (agent_completed, auth_success, …) silence

The chosen clip is extracted from the embedded audio to a cache dir and handed to a system
player in a detached process. Every path exits 0, so the hook never blocks or errors your
session.

Each category plays by default; only automatic hook playback is gated (manual meeseeks play
always plays). See Configuring which sounds play below.

Why not the Stop hook? Stop fires at the end of every turn - including
auto-continuations - so it plays sounds when you aren't actually being waited on. The
event-type filter is the reliable signal for "it's your turn."

Configuring which sounds play

Use the plugin's slash commands from any Claude Code session:

/mr-meeseeks:status            # show which categories are on/off
/mr-meeseeks:mute feedback     # silence a category (done | asking | feedback | all)
/mr-meeseeks:unmute done       # turn it back on
/mr-meeseeks:mute all          # silence everything
/mr-meeseeks:help              # what the categories mean + how to configure

Choices are saved to ~/.config/claude-meseeks/state.json (honoring $XDG_CONFIG_HOME) and
take effect immediately - no /reload-plugins or restart needed. The equivalent CLI verbs
are meeseeks status / disable / enable / toggle.

Why slash commands instead of the /plugin config screen? Claude Code currently renders
every plugin userConfig option as a free-text field with no working toggle
(claude-code#74289), so a real
in-UI boolean toggle isn't possible yet. The slash commands are the reliable path. Power users
can still set CLAUDE_PLUGIN_OPTION_enableDone / enableAsking / enableFeedback to false
in settings.json; the state file above takes precedence over those.

Customizing clips

Clips live under audio/, sorted into three folders that map to behavior:

  • audio/done/ - played when Claude finishes and it's your turn (idle prompt).
  • audio/asking/ - played on permission/input prompts.
  • audio/feedback/ - played every time you submit a prompt to Claude.

To change what plays, move .mp3 files between the folders or drop your own in, then
rebuild the binaries so the new clips are re-embedded:

./scripts/build.sh    # regenerates bin/ for all platforms

Two constraints: filenames must end in .mp3, and - because of a go:embed restriction -
must not contain apostrophes (').

Why Meeseeks? On single-purpose sessions

The theme isn't just a joke - it's a working philosophy.

A Mr. Meeseeks is summoned to accomplish one task. It exists only until that task is
done, and then it poofs out of existence, satisfied. Give a Meeseeks a single, concrete goal
("help me finish this putt") and it's cheerful and effective. Give it a vague or unbounded
one, or keep it alive long past its purpose, and things degrade fast - "existence is
pain, Jerry!"
- until you get a room full of increasingly unhinged Meeseeks.

A Claude Code session works best the same way:

  • Summon it for one goal. A session scoped to a single, well-defined objective -
    "add this endpoint", "fix this failing test", "write this plugin" - is focused and sharp,
    the same way a fresh Meeseeks is.
  • Let it finish, then let it go. When the goal is met, end the session. Start a new one
    for the next task. A fresh session with a clean context beats a stale one every time.
  • Beware the long-lived session. Dragging one conversation across many unrelated goals
    is how you get the Meeseeks box problem: context piles up, focus drifts, earlier tangents
    pollute later work, and quality slides. Long ≠ productive.

So: treat each session like a Meeseeks. One purpose. Accomplish it. Poof. 🔵

Note on the audio

The voice clips are from Rick and Morty (via the
jayuzumi.com Mr. Meeseeks Soundboard) and are
included here for personal, non-commercial fun. They are the property of their respective
rights holders. Please consider those rights before redistributing this plugin publicly or
swap in your own audio.

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.