
# π Veskslop
### The headless, agentic, MCP-pilled Discord client.
**No window. No mouse. No human. Just tools, pipes, and a Discord account living its best digital life.**
[](#)
[](#-why-though)
[](#-mcp-the-brain)
[](#-audio-pipes)
[](#-media-archive)
[](#-video-streams)
[](https://github.com/Vencord/Vesktop)
[](LICENSE)
---
> β οΈ **Veskslop is NOT Vesktop.** They are separate projects with separate goals.
> [Vesktop](https://github.com/Vencord/Vesktop) makes Discord nicer for **humans**.
> Veskslop deletes the human entirely and installs a robot in their place.
## π What is Veskslop
Veskslop takes the beloved Vesktop base and deletes the part where a person has to click things. What remains is a **headless Discord client** driven through a **validated capability layer**, so an **AI agent can run a real Discord account over MCP**. Text automation and the first audio pipes work today. Video streams are the next descent into madness.
It is Discord, but as infrastructure. It is the account you already have, plus `curl`, minus dignity.
Think of it as:
- π₯οΈ **A Discord client with the client removed.** Runs on a server, in a container, on a Raspberry Pi, in your weird home lab, wherever.
- π§ **An agent body (text tools live).** Your MCP-capable AI gets a real account with real permissions and real consequences.
- π **A proxy (planned).** Messages, events, voice state, attachments β everything forwarded, interceptable, scriptable, and API-shaped.
- π **An audio router (partly live).** TTS into the call, ducking, browser monitoring, and captured call audio with Vosk STT. Browser microphone puppeting is next.
- πΌ **A media archive (live).** Walks a channel's whole history, indexes every image, GIF, video, and audio item, caches previews, and makes it all browsable and searchable in the web UI.
- πΉ **A streaming endpoint (planned).** Push files, cameras, generative visuals, or pure slop into a voice channel.
- π§ͺ **A science experiment that will absolutely not get your account banned** *(allegedly)*.
> **Status: text, voice, and the media archive work.** The real Vesktop client runs headless and is driven through a validated capability layer. Triggers, trust tiers, conversation context, response policy, persistent logging, MCP tools, user search, voice state, voice join/leave/move, a virtual-mic TTS pipeline with ducking, browser call monitoring, VAD-segmented call capture with Vosk STT, core process control, web QR login, and the Nocturne-style debug web UI over self-signed HTTPS are live. The media archive walks channel history on both a dedicated bot and the puppet, caches previews, backfills titles and previews in the background, and ships its own Media and Bot tabs. Reaction polls are paused. Browser microphone puppeting and video are still ahead. The design docs live in [docs/INDEX.md](docs/INDEX.md).
## πΏ Why though
Because clicking is for mortals. Because you want a Discord presence that never sleeps, never typos, and never says "brb". Because "can an AI run a Discord account" is the kind of question that deserves a yes and a README.
Real reasons people actually want this:
- Automate community management, moderation, and notifications without a desktop app running.
- Bridge Discord into other systems: chatops, dashboards, MCP agents, home automation, whatever.
- Route voice audio both ways: feed a bot ears and a mouth.
- Stream synthetic video into a voice channel for demos, testing, or entertainment.
- Run entirely headless on a VPS with no GUI stack whatsoever.
## π§ MCP: the brain
Veskslop ships an **MCP server** so any MCP-capable agent (Claude, GPT-based agents, your local Llama abomination, a cron job with delusions of grandeur) can operate the account through structured tool calls.
**Live tool surface** (names may change, vibes will not):
| Tool | Description |
| --- | --- |
| `get_state` | User, guilds, and channels. Cache-only, zero queries. |
| `get_voice_state` | Which voice channel a user is in and who else is suffering there. |
| `get_voice_overview` | Occupied voice channels in a guild and their members. |
| `voice_join` / `voice_leave` / `voice_move` | Join muted, leave, or move the account's call. |
| `get_audio_status` / `speak` / `stop_audio` | Virtual-mic TTS state, queue text, stop playback. |
| `start_capture` / `stop_capture` / `get_transcript` | Segment call audio, stop, read the transcript. |
| `search_users` | Find a user ID from a username, nickname, or cached profile. |
| `list_dms` | Cached DMs and group DMs with recipients, unread counts, and last-message time. |
| `send_message` | Send a message as the account. Send-paced. |
| `read_messages` | Read the client's message cache. |
| `send_dm` | Slide into someone's DMs. |
| `get_context` | Recent conversation context for a channel. Fetches new messages only. |
| `get_message_log` | Trigger log: trusted entries and a reserved untrusted buffer. |
| `get_action_log` | Durable audit trail: triggers, commands, replies, errors. |
| `get_puppet_config` / `set_puppet_config` | Response policy, context limits, poll duration. |
| `whitelist_list` / `whitelist_add` / `whitelist_remove` | Trust tiers: user, trusted, admin. |
| `run_commands` | Run several read-only tools in one call. |
| `scrape_media` | Start a media scrape of a channel or group chat (links or download mode). |
| `stop_media_scrape` / `resume_media_scrape` / `delete_media_scrape` | Control and clean up scrapes. |
| `list_media_scrapes` / `get_media_scrape` | Scrape states, counters, and history. |
| `query_media` | Query the archive: kind, source, provider, extensions, size/length, title search, sort. |
| `get_media_item` | One item with its local file, preview, and message link. |
| `count_media_messages` / `get_media_storage` | Discord search totals and storage usage. |
There is also a debug web UI on `https://