About Discord
discord-mcp is an MCP server for managing Discord through an LLM or MCP client, with 168 tools spanning messages, moderation, channels, roles, and more. It supports rich messages and persistent role menus, with guarded URL fetching and options for stdio or HTTP transport.
Key features
- 01Manage messages, channels, roles, and threads
- 02Moderate servers and manage AutoMod
- 03Create rich messages, polls, and files
- 04Use role menus that survive restarts
- 05Choose stdio, HTTP, or Unix socket transport
Use cases
- 01Post replies, embeds, polls, or files
- 02Manage channel access and server roles
- 03Review moderation queues and AutoMod
- 04Offer persistent role-selection interactions
MCP support
Exposes 168 Discord management tools to MCP clients. It supports stdio and HTTP transports, with HTTP also able to listen on a Unix socket.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
npx -y @willuhmjs/discord-mcpDISCORD_TOKENSecretDiscord bot token from https://discord.com/developers/applicationsDISCORD_GUILD_IDDefault server (guild) ID used when a tool call omits guildIdENABLE_MEMBERS_INTENTSet to 1 to enable the privileged Server Members intent (needed for member-list tools)Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMEdiscord-mcp
An MCP server that lets an LLM run a Discord server: 168 tools for messages, moderation, channels, roles, threads, events, invites, webhooks, AutoMod and more. Works with Claude, Cursor, VS Code, or any MCP client.
- Rich messages: embeds, Components V2, polls, files, replies — validated before they reach Discord, with errors that name the bad field.
- Interactions: role menus that survive restarts, plus a log of who clicked what.
- Secure by default: binds to
127.0.0.1, SSRF-guarded URL fetching, webhook tokens never echoed.
Quick start
- Create a bot in the developer portal, invite it to your server, and enable the Message Content intent (Bot → Privileged Gateway Intents).
- Add this to your MCP client's config (
mcp.json,claude_desktop_config.json,.cursor/mcp.json, ...):
{
"mcpServers": {
"discord": {
"command": "npx",
"args": ["-y", "@willuhmjs/discord-mcp", "--stdio"],
"env": {
"DISCORD_TOKEN": "your-bot-token",
"DISCORD_GUILD_ID": "your-server-id"
}
}
}
}
VS Code uses "servers" instead of "mcpServers". On Windows, if the client can't find npx, use
"command": "cmd" with "args": ["/c", "npx", "-y", "@willuhmjs/discord-mcp", "--stdio"].
Claude Code — one command:
claude mcp add discord -e DISCORD_TOKEN=... -e DISCORD_GUILD_ID=... -- npx -y @willuhmjs/discord-mcp --stdio
Docker — a long-running HTTP server at http://127.0.0.1:8085/mcp:
docker run --rm -e DISCORD_TOKEN=... -p 127.0.0.1:8085:8085 ghcr.io/willuhmjs/discord-mcp
Requires Node.js 22+ for npx.
Configuration
| Variable | Default | Meaning |
|---|---|---|
DISCORD_TOKEN | — (required) | Bot token. |
DISCORD_GUILD_ID | — | Default server for tools when guildId is omitted. |
ENABLE_MEMBERS_INTENT | off | Enables the privileged Server Members intent (also enable it in the portal). Member-list tools need it. |
MCP_TRANSPORT | http | stdio for stdin/stdout. The --stdio flag does the same. |
HOST / PORT | 127.0.0.1 / 8085 | HTTP bind address and port. |
MCP_SOCKET | — | Listen on a Unix socket instead of HOST:PORT (HTTP mode only). |
In HTTP mode, POST /mcp serves MCP (stateful sessions via Mcp-Session-Id) and GET /health returns
200 once the bot is connected.
Keeping the HTTP endpoint private
The HTTP endpoint has no authentication: anyone who can reach it can use every tool as the bot. Keep it on loopback or a private network. On a shared machine, other accounts can still reach a loopback port, so use a Unix socket that only you can open:
mkdir -m 700 ~/.mcp
MCP_SOCKET=~/.mcp/discord.sock DISCORD_TOKEN=... npx @willuhmjs/discord-mcp
curl --unix-socket ~/.mcp/discord.sock http://localhost/health
The socket is created with mode 600. Avoid network file systems such as NFS. The Docker image binds
0.0.0.0, so keep that container on an internal network. stdio mode has no network exposure at all.
Tools
Every tool, with its parameters and the Discord permission it needs, is listed in
docs/TOOLS.md, along with the
conventions (string IDs, JSON-string payloads, reason for the audit log) and message/component formats.
Security
- Every URL a tool fetches (emoji, stickers, files, avatars) goes through one guarded fetcher: http/https only, private/loopback/metadata IPs blocked before the request and after every redirect, size and time limits.
- Webhook tokens are credentials:
create_webhookreturns the URL once, and no list/get tool shows it. - No tool reads the server's filesystem.
Development
npm ci
npm run build # tsc -> dist/
npm test # vitest, no Discord token needed
npm run typecheck
A contract test locks every tool name and parameter set against tests/fixtures/tool-contract.json.
TESTING.md is the manual checklist for a run in a real test server.
Releases are automated: commits on main using Conventional Commits
(feat:, fix:, feat!:) feed a release PR; merging it publishes to npm, the MCP Registry and GHCR.
License
MIT
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.