Discord MCP
Provides tools for interacting with Discord's REST API, enabling management of servers, channels, messages, reactions, pins, threads, members, roles, invites, and direct messages.
Click on "Deploy 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., "@Discord MCPlist my guilds"
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.
Discord MCP
A Python MCP server for reading messages, inspecting channels and servers, and managing Discord through its REST API. Runs locally over stdio with one environment variable: DISCORD_TOKEN.
The token is sent verbatim in the Authorization header. This server never adds Bot, Bearer, or another prefix. It does not attempt to detect or change the credential type.
Install
Requires Python 3.11+.
git clone https://github.com/RestartFU/discord-mcp.git
cd discord-mcp
python3 -m venv .venv
.venv/bin/pip install .Configure an MCP client with the absolute path to the installed executable:
{
"mcpServers": {
"discord": {
"command": "/absolute/path/to/discord-mcp/.venv/bin/discord-mcp",
"env": {
"DISCORD_TOKEN": "your-token-exactly-as-supplied"
}
}
}
}On Windows, use .venv\\Scripts\\discord-mcp.exe. You can also supply DISCORD_TOKEN through the parent process environment and omit env. .env files are not loaded automatically. Keep credentials out of source control.
Start by calling get_current_user, then list_guilds, list_channels, and read_messages. Enable Discord Developer Mode to copy IDs, or use the IDs returned by these tools. IDs are strings to preserve precision.
Related MCP server: discord-mcp
Tools
Area | Tools |
Identity and servers |
|
Channels |
|
Messages |
|
Reactions and pins |
|
DMs and threads |
|
Members and roles |
|
Invites |
|
General REST |
|
discord_request covers other REST operations such as bans, kicks, permission overwrites, webhooks, emojis, scheduled events, archived threads, polls, and role edits. It accepts only API-relative paths under https://discord.com/api/v10; the credential is not forwarded to redirects or arbitrary hosts.
Example: inspect permission overwrites with get_channel, then update one:
{
"method": "PUT",
"path": "/channels/CHANNEL_ID/permissions/ROLE_ID",
"body": {"type": 0, "allow": "1024", "deny": "0"},
"reason": "Allow the selected role to view this channel"
}Upload a file by passing files alongside a message body to discord_request:
{
"method": "POST",
"path": "/channels/CHANNEL_ID/messages",
"body": {"content": "Attached note", "allowed_mentions": {"parse": []}},
"files": [{"filename": "note.txt", "data_base64": "SGVsbG8h", "content_type": "text/plain"}]
}Uploads are limited to 10 files and 10 MiB total per request. The dedicated send/edit tools suppress mention parsing; the general REST tool uses your payload as supplied.
Access and behavior
This is REST access, not a complete Discord desktop client: no voice/video streaming, Gateway event subscription, or automatic CAPTCHA handling. Operations succeed only where Discord accepts the supplied Authorization value and grants the required permissions. Raw credentials are not guaranteed to work with every endpoint. Discord's documented authentication uses typed Authorization values; this implementation deliberately leaves your supplied value unchanged.
History returns at most 100 messages per request; use the oldest message ID as before for older pages. Server and member lists also support pagination. Search may return an indexing response instead of results. See Discord's message documentation for content access requirements and endpoint fields.
Requests are serialized per process, and 429 rate limits are retried up to three times using Discord's delay. Long waits are returned as errors and retained as a local cooldown. Network errors and 5xx responses are not retried automatically because a write may already have succeeded. Multiple server processes do not share rate-limit state.
The credential is redacted from returned data and API error text. Tool results can still contain private Discord content, invite codes, or webhook credentials; the MCP client receiving them must be trusted. Tool annotations identify reads and destructive operations. The general REST tool is conservatively marked destructive because it can write or delete.
Development
.venv/bin/pip install -e '.[dev]'
.venv/bin/ruff check .
.venv/bin/ruff format --check .
.venv/bin/pytestTests use mocked Discord HTTP responses and a real MCP stdio handshake; no Discord token or live messages are required. The implementation uses the official MCP Python SDK, pinned to its 1.x API.
Available Tools
32 toolsadd_member_roleA
Assign a server role to a member.
| Name | Required | Description | Default |
|---|---|---|---|
| role_id | Yes | ||
| user_id | Yes | ||
| guild_id | Yes |
add_reactionA
React using a Unicode emoji or custom name:id; URL encoding is automatic.
| Name | Required | Description | Default |
|---|---|---|---|
| emoji | Yes | ||
| channel_id | Yes | ||
| message_id | Yes |
create_channelA
Create a server channel; data includes name and optional type or permission_overwrites.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| guild_id | Yes |
create_dmB
Open a direct-message channel with a user, subject to Discord permissions.
| Name | Required | Description | Default |
|---|---|---|---|
| recipient_id | Yes |
create_inviteB
Create a channel invite; data may include max_age, max_uses and unique.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| channel_id | Yes |
create_roleC
Create a server role using Discord role fields.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| guild_id | Yes |
create_threadC
Start a thread; data includes name, type and optional auto_archive_duration.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| channel_id | Yes |
delete_channelADestructive
Delete a channel or close a DM.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes |
delete_messageBDestructive
Delete a message where permitted.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | ||
| message_id | Yes |
discord_requestADestructive
Call any Discord v10 REST endpoint, e.g. /guilds/123/roles.
Covers permissions, roles, moderation, invites, webhooks, emojis, scheduled events, threads, polls, and other REST operations. Supply API-relative path and query separately. Files: [{"filename": "note.txt", "data_base64": "...", "content_type": "text/plain"}]. Total upload limit is 10 MiB. Discord permissions and endpoint limits still apply.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| path | Yes | ||
| files | No | ||
| query | No | ||
| method | Yes | ||
| reason | No |
edit_messageBDestructive
Edit an existing message where the credential permits it.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| channel_id | Yes | ||
| message_id | Yes |
get_channelARead-only
Inspect channel metadata and permission overwrites.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes |
get_current_userARead-only
Inspect the authenticated Discord account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_guildCRead-only
Inspect server details.
| Name | Required | Description | Default |
|---|---|---|---|
| guild_id | Yes |
get_memberARead-only
Inspect a server member and their roles.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | ||
| guild_id | Yes |
get_messageARead-only
Read one message.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | ||
| message_id | Yes |
get_userBRead-only
Inspect a user profile.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes |
list_active_threadsARead-only
List active server threads accessible to this credential.
| Name | Required | Description | Default |
|---|---|---|---|
| guild_id | Yes |
list_channelsCRead-only
List channels in a server.
| Name | Required | Description | Default |
|---|---|---|---|
| guild_id | Yes |
list_guildsBRead-only
List accessible servers; pass the last ID as after to paginate.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| before | No |
list_invitesBRead-only
List server invites where permitted.
| Name | Required | Description | Default |
|---|---|---|---|
| guild_id | Yes |
list_membersARead-only
List server members, subject to required intents. Paginate with the last user ID.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| guild_id | Yes |
list_pinsARead-only
List the first page of pinned messages; use discord_request with before to paginate.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes |
list_rolesBRead-only
List server roles and permissions.
| Name | Required | Description | Default |
|---|---|---|---|
| guild_id | Yes |
pin_messageB
Pin a message in its channel.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | ||
| message_id | Yes |
read_messagesARead-only
Read channel or thread history. Use the oldest message ID as before for older pages.
Only one of before, after, around may be supplied. Discord may omit message content when the credential lacks the required access or intent.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| around | No | ||
| before | No | ||
| channel_id | Yes |
remove_member_roleBDestructive
Remove a server role from a member.
| Name | Required | Description | Default |
|---|---|---|---|
| role_id | Yes | ||
| user_id | Yes | ||
| guild_id | Yes |
search_messagesBRead-only
Search server messages with optional channel and author filters.
A 202 indexing response is returned as data; retry later if indexing is not complete.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| content | Yes | ||
| guild_id | Yes | ||
| author_id | No | ||
| channel_id | No |
send_messageA
Send a message or reply. Mentions do not ping by default.
Use discord_request for attachments, embeds, polls, components, or explicit mentions.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| reply_to | No | ||
| channel_id | Yes |
unpin_messageADestructive
Remove a message pin.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | ||
| message_id | Yes |
update_channelBDestructive
Update channel name, topic, permissions, or thread metadata using Discord fields.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| channel_id | Yes |
update_memberBDestructive
Modify member nickname, roles, timeout, mute, or voice channel using Discord fields.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| user_id | Yes | ||
| guild_id | Yes |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
32 tool updates
v0.1.0- First observed
add_member_role - First observed
add_reaction - First observed
create_channel - First observed
create_dm - First observed
create_invite - First observed
create_role - First observed
create_thread - First observed
delete_channel - First observed
delete_message - First observed
discord_request - First observed
edit_message - First observed
get_channel - First observed
get_current_user - First observed
get_guild - First observed
get_member - First observed
get_message - First observed
get_user - First observed
list_active_threads - First observed
list_channels - First observed
list_guilds - First observed
list_invites - First observed
list_members - First observed
list_pins - First observed
list_roles - First observed
pin_message - First observed
read_messages - First observed
remove_member_role - First observed
search_messages - First observed
send_message - First observed
unpin_message - First observed
update_channel - First observed
update_member
TDQS
Scored across 32 tools
Most tools map cleanly to distinct Discord resources (messages, channels, roles, members, guilds). The main ambiguity is discord_request, which overlaps with nearly every other tool by design, but its generic nature is clearly described as a catch-all REST endpoint accessor.
The vast majority of tools follow a consistent verb_noun pattern: read_messages, delete_message, list_roles, create_channel, get_guild, add_member_role. Minor deviations exist, such as discord_request as a standalone generic tool and get_current_user not matching the list/get style perfectly, but the overall pattern is predictable.
32 tools is on the heavier side but justified for a Discord server integration covering messages, channels, members, roles, threads, invites, and reactions. The generic discord_request tool helps keep the count from being even larger, and every tool addresses a concrete Discord operation.
The surface covers core interaction and moderation workflows well: message lifecycle, channel lifecycle, role assignment, member updates, invites, threads, pins, reactions, and DMs. Notable gaps include no dedicated webhook/emoji/event tools, though discord_request explicitly covers those REST operations, so agents can work around the gap.
Related MCP Connectors
Read and edit GA4, Search Console and Google Tag Manager from any MCP client. 29 tools.
Discover, inspect and run 63,000+ agent tools from one balance. Pay per call, no subscriptions.
Read-only DERO blockchain MCP: 33 tools (12 composites) incl. TELA discovery + bundled docs.
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Related MCP Servers
- AlicenseAqualityFmaintenanceEnables LLMs to read and send Discord messages, list servers and channels, and monitor unread messages via a selfbot that uses a user token (violates Discord ToS).813 npm1MIT
- AlicenseNot gradedqualityDmaintenanceProvides full Discord REST API access through a bot token, enabling server management including channels, messages, members, roles, and more.203 npm1MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to interact with Discord through the REST API, supporting message reading and sending, channel and guild management, threads, pins, and reactions.17MIT
- AlicenseNot gradedqualityBmaintenanceGrants read-only access to your own Discord DMs, group chats, and server channels, letting a model search messages, pull recent or full conversation history, and view attachments like images and PDFs. Messages are kept in a local SQLite cache with full-text search, with older history fetched from Discord only on demand.1MIT