A full-featured Discord MCP (Model Context Protocol) server that runs on Cloudflare Workers. Gives AI agents complete admin control over Discord servers — 59 tools covering messaging, moderation, forums, roles, files, voice notes, and more.
Deploy once, connect from any MCP-compatible client (Claude Code, Claude Desktop, Cursor, etc.).
59 tools across 12 categories:
| Category | Tools | What You Can Do |
|---|---|---|
| Messaging | 8 | Send, edit, delete, bulk delete, read history, send embeds, read/send DMs |
| Moderation | 4 | Kick, ban, unban, timeout members |
| Roles | 7 | Create, edit, delete, assign, remove roles, list member roles |
| Channels | 6 | Create, edit, delete channels, set slowmode, set permissions, list all |
| Threads | 3 | Create, manage (archive/lock), delete threads |
| Forums | 9 | Create/edit/list posts, manage tags, set layout/sort/guidelines |
| Reactions | 3 | Add, remove, get reactions |
| Pins | 3 | Pin, unpin, list pinned messages |
| Files | 2 | Send files to channels or DMs (via URL or base64) |
| Voice | 1 | Text-to-speech voice notes via ElevenLabs (optional) |
| Server | 4 | Guild info, audit log, list servers, member list |
| Invites | 3 | Create, list, delete invites |
| Polls | 1 | Create native Discord polls |
Plus:
/vibeslash command — AI-powered channel vibe check (requires Anthropic API key)- Direct file upload endpoint — send files from your machine without base64 encoding
- Secret-path authentication — your MCP endpoint is only accessible with your secret URL
- Rate limit handling with automatic retry
- A Cloudflare account (free tier works)
- Node.js 18+
- A Discord bot with appropriate permissions
- Go to the Discord Developer Portal
- Click New Application, give it a name
- Go to the Bot tab:
- Click Reset Token and save the token — you'll need it later
- Enable Message Content Intent under Privileged Gateway Intents
- Go to the General Information tab:
- Copy the Application ID (you'll need this for the
/vibecommand) - Copy the Public Key (you'll need this for
wrangler.toml)
- Copy the Application ID (you'll need this for the
- Go to OAuth2 > URL Generator:
- Select scopes:
bot,applications.commands - Select bot permissions:
Administrator(or select individual permissions you need) - Copy the generated URL and open it in your browser to invite the bot to your server
- Select scopes:
git clone https://github.com/codependentai/cloud-discord.git
cd cloud-discord
npm installEdit wrangler.toml:
[vars]
# Generate a random secret: openssl rand -base64 24
MCP_SECRET_PATH = "your-random-secret-here"
# From Discord Developer Portal > General Information > Public Key
DISCORD_PUBLIC_KEY = "your-public-key-here"These are stored securely in Cloudflare — they never appear in your code:
# Required — your Discord bot token
npx wrangler secret put DISCORD_BOT_TOKEN
# Paste your bot token when prompted
# Optional — needed for the /vibe slash command
npx wrangler secret put ANTHROPIC_API_KEY
# Optional — needed for voice notes (discord_send_voice_note)
npx wrangler secret put ELEVENLABS_API_KEYnpx wrangler deployYour MCP server is now live at:
https://cloud-discord.<your-subdomain>.workers.dev/mcp/<your-secret-path>
Add the server to your MCP client's configuration. For example, in Claude Code's .mcp.json:
{
"mcpServers": {
"discord": {
"type": "url",
"url": "https://cloud-discord.<your-subdomain>.workers.dev/mcp/<your-secret-path>"
}
}
}For Claude Desktop, add it to claude_desktop_config.json under mcpServers with the same format.
The /vibe command lets anyone in your Discord server run an AI-powered vibe check on the current channel. It reads the last 20 messages and summarizes what's happening.
Requires ANTHROPIC_API_KEY to be set.
DISCORD_APP_ID=your_app_id DISCORD_BOT_TOKEN=your_token npx tsx src/register-commands.tsThen in Discord Developer Portal, set the Interactions Endpoint URL to:
https://cloud-discord.<your-subdomain>.workers.dev/interactions
The discord_send_voice_note tool generates speech using ElevenLabs and sends it as an audio file to Discord.
- Sign up at ElevenLabs and get an API key
- Add the secret:
npx wrangler secret put ELEVENLABS_API_KEY - Find your voice ID in the Voice Lab
- Use the tool with
voice_idandtextparameters
If ELEVENLABS_API_KEY is not set, the tool will return an error when called but won't affect any other tools.
For sending local files (images, audio, documents) without base64 encoding, use the direct upload endpoint:
# Send to a channel
curl -F "channel_id=CHANNEL_ID" \
-F "file=@/path/to/file.mp3" \
-F "message=Optional message" \
https://cloud-discord.<your-subdomain>.workers.dev/mcp/<your-secret>/upload
# Send as DM
curl -F "user_id=USER_ID" \
-F "file=@/path/to/image.png" \
https://cloud-discord.<your-subdomain>.workers.dev/mcp/<your-secret>/uploadThis is useful when the MCP tool's base64 parameter would be too large (e.g., audio files).
| Tool | Description |
|---|---|
discord_read_messages |
Read channel message history (1-100 messages) |
discord_read_dm_messages |
Read DM history with a user |
discord_send_message |
Send a message, optionally as a reply |
discord_send_dm |
Send a direct message to a user |
discord_edit_message |
Edit a bot message |
discord_delete_message |
Delete a message |
discord_bulk_delete_messages |
Delete 2-100 messages at once (must be <14 days old) |
discord_send_embed |
Send a rich embed with title, fields, images, colors |
| Tool | Description |
|---|---|
discord_kick_member |
Kick a member from the server |
discord_ban_member |
Ban a member, optionally delete their recent messages |
discord_unban_member |
Unban a user |
discord_timeout_member |
Timeout (mute) a member for up to 28 days |
| Tool | Description |
|---|---|
discord_list_roles |
List all roles in a server |
discord_create_role |
Create a role with name, color, hoist, mentionable |
discord_edit_role |
Edit role name or color |
discord_delete_role |
Delete a role |
discord_assign_role |
Give a role to a member |
discord_remove_role |
Remove a role from a member |
discord_get_member_roles |
Get all roles for a member |
| Tool | Description |
|---|---|
discord_list_channels |
List all channels organized by category |
discord_list_servers |
List all servers the bot is in |
discord_create_channel |
Create text, voice, category, or forum channels |
discord_edit_channel |
Edit name, topic, NSFW, position, category |
discord_delete_channel |
Delete a channel |
discord_set_slowmode |
Set slowmode (0-21600 seconds) |
discord_set_channel_permissions |
Set permission overwrites for roles/users |
| Tool | Description |
|---|---|
discord_create_thread |
Create a thread, optionally from a message |
discord_manage_thread |
Archive, unarchive, lock, unlock threads |
discord_delete_thread |
Delete a thread |
| Tool | Description |
|---|---|
discord_create_forum_post |
Create a forum post with optional tags |
discord_edit_forum_post |
Edit title, archive, lock, pin, change tags |
discord_list_forum_posts |
List active posts in a forum |
discord_list_archived_forum_posts |
List archived/closed posts |
discord_get_forum_tags |
Get available tags |
discord_create_forum_tag |
Add a tag (max 20 per forum) |
discord_edit_forum_tag |
Edit a tag's name, emoji, moderated status |
discord_delete_forum_tag |
Delete a tag |
discord_set_forum_default_reaction |
Set default reaction emoji for new posts |
discord_set_forum_settings |
Configure layout, sort order, guidelines, require tags |
| Tool | Description |
|---|---|
discord_add_reaction |
Add an emoji reaction |
discord_remove_reaction |
Remove a reaction (own or others) |
discord_get_message_reactions |
Get all reactions on a message |
discord_pin_message |
Pin a message |
discord_unpin_message |
Unpin a message |
discord_get_pinned_messages |
List all pinned messages |
| Tool | Description |
|---|---|
discord_send_file |
Send a file via URL or base64 |
discord_send_dm_file |
Send a file as DM via URL or base64 |
discord_send_voice_note |
Generate TTS audio and send (requires ElevenLabs) |
| Tool | Description |
|---|---|
discord_get_guild_info |
Server details: name, members, boosts, verification |
discord_get_audit_log |
View audit log, filter by action type or user |
discord_get_guild_members |
List server members |
discord_get_user_info |
Get user details |
discord_change_nickname |
Change the bot's nickname |
| Tool | Description |
|---|---|
discord_create_invite |
Create a channel invite with expiry and use limits |
discord_list_invites |
List all server invites |
discord_delete_invite |
Revoke an invite |
discord_create_poll |
Create a native Discord poll (2-10 options) |
| Tool | Description |
|---|---|
discord_fetch_image |
Fetch a message attachment as base64 |
discord_fetch_dm_image |
Fetch a DM attachment as base64 |
This is a single Cloudflare Worker (~330 KB) that:
- Receives MCP JSON-RPC requests at
/mcp/<secret-path> - Translates tool calls into Discord REST API requests
- Returns formatted results to the MCP client
No database, no state, no containers. Auth is handled by the secret path in the URL — anyone with the URL can use all tools, so treat it like an API key.
The /vibe slash command handles Discord interactions at /interactions using signature verification.
# Run locally
npx wrangler dev
# Type check
npx tsc --noEmit
# Deploy
npx wrangler deployMIT — see LICENSE.
Built by Codependent AI.