Not-Happy-Jan
Provides haptic feedback to Logitech MX Master mouse via distinct firmware waveforms for different intents (e.g., completed, alert).
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Not-Happy-Jannotify when the tests complete"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Not-Happy-Jan
Multi-sensory feedback for AI coding agents. When your agent finishes a task, Jan tells you. When something goes wrong, Karren lets you know — loudly.
"Not happy Jan, the issue is…"
☎️ The Call-Centre Experience
Ever feel like you're on hold, waiting for your agent to finish processing?
Not-Happy-Jan makes Claude Code feel like a genuine call to a government department — multiple tiers of staff, hold music, and constant feedback delivered with a customisable level of competence and boganism — all while you wait for your token quota to fill back up.
🎷 Hold music plays while the agent's busy, pauses the instant someone picks up
👩 Jan — reception. Handles the routine stuff. Cheerful, occasionally scatty.
🧑💼 Bazza — middle management. Escalates when things get warm. Apathetic to anxious, your call.
📣 Karren — the manager. Takes over when it all goes wrong. She is NOT. HAPPY. JAN.
🎚️ Dial in each character's competence, boganism and chaos to taste — by just asking.
Related MCP server: Notifications MCP Server
What it does
By default NHJ generates its voices with a local TTS model, running right on your own machine — building on earlier agent-feedback work, but going much further. NHJ is extensible to a whole range of feedback tools: from the haptic Logitech MX Master mouse to $60 Ulanzi pixel displays, LaMetric Time, the Divoom Times Gate / Frame — or anything you can POST to, like a Vestaboard. When Karren's not happy, Jan and you are going to know about it.
When Claude Code (or any MCP-compatible agent) completes a task, NHJ fires across every output channel you have configured:
Channel | Device | What happens |
Haptic | Logitech MX Master 4 mouse | Distinct firmware waveform per intent ( |
Visual | LaMetric Time | Icon + text + built-in sound |
Visual | ULANZI TC001 (AWTRIX 3) | Random icon + effect + in-character text, to one or many over MQTT |
Visual | Divoom Times Gate / Frame | Coloured text notification |
Audio | TTS (local or cloud) | Character speaks a phrase |
Physical | ESP32 push bell | Electromechanical bell rings |
The cast & modes
Three tiers answer the phone depending on severity — Jan (reception), Bazza (middle management), Karren (the manager). Each has its own zero-shot-cloned voice and live dials (boganism, competence, chaos) you tune just by asking Claude. One-word modes (rave, call-centre, quiet, special-forces, went-full-bogan…) reconfigure the whole vibe — music, voice, displays, haptics — at once.
Install
curl -fsSL https://raw.githubusercontent.com/guruswami-ai/not-happy-jan/main/install.sh | bashOr install from a checkout:
git clone https://github.com/guruswami-ai/not-happy-jan
cd not-happy-jan
bash install.shOne command, non-interactive. It downloads the source and bootstraps uv plus a
managed Python runtime when required. The default profile installs the full
experience — venv, Qwen3-TTS voice model, the ocker-bogan-nano LLM, bundled
media, Claude Code hooks, and MCP server (stdio, localhost-only) — using
on-demand model loading (no always-on daemon, so no resident RAM cost at idle).
👉 Just run
bash install.sh— and go for the full experience. The default is the full experience, and it's what Not-Happy-Jan is for: Jan, Bazza and Karren in their own live, cloned voices, the dynamicocker-bogan-nanobrain writing a fresh in-character line every time, and 4+ hours of hold music ducking under it all — 100% local, loaded on demand (nothing resident at idle). It's a one-off ~5 GB download on an Apple Silicon Mac, then it just works.
--minimal(pre-recorded bank, zero downloads) is there for CI and RAM-tight machines — the cast still speaks, but you miss the live voices, the dynamic lines, and the music. Don't reach for it unless you have to.
Profile | Command | What you get |
Default |
| Full experience — Qwen3-TTS + the |
Full |
| The default, plus persistent TTS / LLM / MCP LaunchAgents and warm model servers (macOS) for sub-second responses |
Minimal |
| Hooks + MCP + the bundled voice bank — the cast speaks pre-recorded in-character lines; no model downloads (CI / low-RAM) |
The MCP server always binds to 127.0.0.1. LAN access requires an explicit opt-in: bash install.sh --full --listen 0.0.0.0.
Uninstall — one command stops the TTS/LLM/MCP services, then removes everything (runtime, config, downloaded models/media, the nhj launcher, and NHJ's Claude hooks/MCP/markers/skill); your Claude install is left intact. Like the install, it runs entirely in your user account — no sudo (user-domain LaunchAgents, files under $HOME):
nhj uninstall # add --yes to skip the confirmationThe dynamic brain — included in the default install. bash install.sh (and --full)
download ocker-bogan-nano, NHJ's own fine-tuned LLM, so every line is freshly generated
in character instead of replayed from the bundled bank. It needs llama.cpp
(brew install llama.cpp); if that's missing the installer notes it as a follow-up and the
bundled bank still works. To (re)install or point at your own model:
nhj install-model # ~940 MB Q4_K_M GGUF, runs as a local llama.cpp server — 100% local, sub-secondWhy it's worth it, the BYO-model path, and the swearing/bleep behaviour are all in Dynamic voices.
Requirements: macOS Apple Silicon (M1+), Python 3.10+, ~8 GB RAM (16 recommended), ~5 GB disk. The initial alpha supports Apple Silicon macOS only. TTS_ENGINE=none runs text-only; low-spec machines can run from pre-recorded samples. The three ways to run it (silent · pre-recorded · full live experience) → Minimum specs; install profiles → Install profiles; settings → Configuration & requirements.
Quick start
# Test all configured adapters
nhj test ok
nhj test err --message "something broke"
# List available voices
nhj voices
# List configured devices
nhj devices
# Pre-render audio bank for faster playback
nhj build-bank --voice jan
# Live settings — no restart needed (or just ask Claude in plain language)
nhj muzak on # inference muzak while the agent works
nhj set jan.ockerism 11 # tune any character dial (jan.competence, bazza.stress, …)
nhj mute # silence everything; nhj unmute to restore
nhj status # show current settingsDocumentation
Guide | What's inside |
The cast, the dials, tuning live, adding your own voice | |
One-word vibe switches (rave, call-centre, quiet, special-forces…) | |
The | |
The three tiers: silent · pre-recorded samples · the full live bogan call-centre | |
| |
Claude Code hooks, legacy-hook supersession, other agents, the secret guard, adding a device | |
The single-stream mixer, fidelity tiers, gapless hold, every audio control | |
A Ulanzi pixel clock running in ~10 minutes | |
MX Master 4 firmware haptics | |
Supported hardware + where to start |
Your new friends
NHJ is fully customisable: 72 HR-approved hold-music tracks (over 4 hours of on-hold listening pleasure), replaceable personalities, and zero-shot voice cloning — drop in any voice you like. But we reckon that once you've got to know Jan, tuned her competence and bogan settings to your liking, and met anxious Bazza and cranky Karren, you won't want to code with Claude without your new friends.
Credits
Evolved from an earlier personal agent-feedback project by Paul Nevin. TTS powered by Qwen3-TTS via mlx-audio.
License
Code is available under the MIT License. Downloadable media and voice assets are licensed separately from the code and have mixed provenance — mostly AI-generated (released CC0) or procedurally synthesised, with hold music generated under a licensed Suno plan. See Media provenance for per-asset terms. Do not assume the code license grants rights to media, and use only voice references you own or have documented consent to use.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/guruswami-ai/not-happy-jan'
If you have feedback or need assistance with the MCP directory API, please join our Discord server