Send and receive Discord messages as your own user account
Discord MCP Server for VS Code
An MCP (Model Context Protocol) server that lets VS Code Copilot (or any MCP-compatible agent) send and receive Discord messages as your own user account — enabling real-time testing of Discord bot commands directly from your editor.
⚠️ Discord ToS Notice: Automating a user account ("self-botting") is against Discord's Terms of Service. This tool is intended strictly for local development/testing of your own bots on your own servers. Do not use it for spam, abuse, or on servers you don't control. Use at your own risk.
Why a user account?
Many bot commands check server state tied to the command invoker — e.g., message.member.voice.channel to verify the user is in a voice channel before playing audio. A separate bot account cannot satisfy these checks. Messages must originate from your real Discord user to test these commands properly.
Prerequisites
- Node.js 18+ (uses native
fetch) - VS Code with GitHub Copilot (or another MCP host like Claude Desktop / Cursor)
- Your Discord user token (see below)
Obtaining your Discord user token
- Open Discord in a browser or the desktop app
- Open Developer Tools (
F12/Ctrl+Shift+I) - Go to the Network tab
- Perform any action in Discord (send a message, switch channels)
- Find any request to
discord.com/api - Copy the
Authorizationheader value — that's your user token
Your user token grants full access to your Discord account. Treat it like a password and never commit it to version control.
Installation
# 1. Clone the repository
git clone https://github.com/masonbesmer/code-discord-mcp.git
cd code-discord-mcp
# 2. Install dependencies
npm install
# 3. Build
npm run build
# 4. Set your Discord user token
cp .env.example .env
# Edit .env and set DISCORD_USER_TOKEN=your-token-here
VS Code Integration
The repository includes .vscode/mcp.json which automatically registers the server with VS Code. The server reads your token from the DISCORD_USER_TOKEN environment variable.
Make sure the variable is set in your shell before launching VS Code:
# macOS / Linux
export DISCORD_USER_TOKEN="your-token-here"
code .
# Windows PowerShell
$env:DISCORD_USER_TOKEN = "your-token-here"
code .
Available Tools
| Tool | Description |
|---|---|
send_message |
Send a text message to a Discord channel |
read_messages |
Read recent messages from a channel |
wait_for_response |
Send a command and wait for a bot response |
list_channels |
List channels in a guild |
list_guilds |
List guilds your account is in |
delete_message |
Delete a message (with confirmation prompt) |
Available Resources
| Resource | Description |
|---|---|
discord://guild/{guildId}/channels |
Channel list for a guild |
discord://channel/{channelId}/recent |
Last 25 messages in a channel |
Example Workflow
- Open your Discord bot project in VS Code
- Start a Copilot Chat session in Agent Mode
- Ask: "Send
!helpto my #bot-testing channel and show me what my bot responds with" - Copilot will:
- Call
list_guildsto find your server - Call
list_channelsto find#bot-testing - Call
wait_for_responsewith!help - Show you the bot's response inline in the chat
- Call
Development
# Watch mode (recompiles on file changes)
npm run dev
# Run tests
npm test
# Debug with MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.js
Security
| Concern | Mitigation |
|---|---|
| Token exposure | Read from env var only; never logged or returned in responses; .env in .gitignore |
| Discord ToS | Local dev/testing on your own servers only |
| Rate limiting | Automatic retry after retry_after on HTTP 429; 500ms polling interval |
| Accidental pings | allowed_mentions: { parse: [] } prevents @everyone/@here pings |
| Destructive actions | delete_message has destructiveHint: true — VS Code shows a confirmation dialog |
| Stdout pollution | All diagnostic output goes to stderr; stdout is reserved for MCP JSON-RPC |
Dependencies
| Package | Purpose |
|---|---|
@modelcontextprotocol/sdk |
MCP server framework (stdio transport, tool registration) |
zod |
Input schema validation |
typescript (dev) |
TypeScript compiler |
@types/node (dev) |
Node.js type definitions |
vitest (dev) |
Test runner |
No Discord library needed. All Discord API calls use Node 18+ native
fetch.
Tools (6)
send_messageSend a text message to a Discord channelread_messagesRead recent messages from a channelwait_for_responseSend a command and wait for a bot responselist_channelsList channels in a guildlist_guildsList guilds your account is indelete_messageDelete a message (with confirmation prompt)Environment Variables
DISCORD_USER_TOKENrequiredYour Discord user account token for authenticationConfiguration
{"mcpServers": {"discord": {"command": "node", "args": ["/path/to/code-discord-mcp/dist/index.js"], "env": {"DISCORD_USER_TOKEN": "your-token-here"}}}}