discord-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DISCORD_TOKEN | Yes | Discord bot authentication token. | |
| DISCORD_MCP_APPROVAL | No | Confirmation mode for destructive operations (`elicitation` or `none`). Any other value stops startup. | elicitation |
| DISCORD_MCP_TOOLSETS | No | Comma-separated list of enabled toolsets. Available: core, messages, reactions, threads, channels, webhooks, guild, members, roles, moderation, events, invites. | core,messages |
| DISCORD_MCP_ALLOW_DMS | No | Permits direct messages and user-scoped operations alongside an active guild allowlist (`true` or `false`). Any other value stops startup. | false |
| DISCORD_MCP_READ_ONLY | No | Blocks all mutating actions and allows read-only tools only (`true` or `false`). Any other value stops startup. | false |
| DISCORD_MCP_FILE_ROOTS | No | Optional comma-separated list of directory paths allowed for uploads. A leading ~/ is expanded to the home directory. If unset or empty, upload file access is open by default subject to built-in exclusions. | |
| DISCORD_MCP_DOWNLOAD_DIR | No | Directory path where attachment downloads are stored. A leading ~/ is expanded to the home directory. Created recursively on first download. | ~/Downloads/discord-mcp |
| DISCORD_MCP_ALLOWED_GUILDS | No | Comma-separated list of allowed guild IDs. When set, operations outside these guilds are refused. | |
| DISCORD_MCP_MAX_UPLOAD_BYTES | No | Maximum upload size in bytes (defaults to 20 MiB). | 20971520 |
| DISCORD_MCP_MAX_DOWNLOAD_BYTES | No | Maximum download size in bytes for discord_download_attachment (defaults to 100 MiB). | 104857600 |
| DISCORD_MCP_RATE_LIMIT_WAIT_MS | No | Maximum wait duration in milliseconds when encountering a Discord rate limit before aborting. | 5000 |
| DISCORD_MCP_REQUEST_TIMEOUT_MS | No | HTTP request timeout in milliseconds for Discord REST API requests. | 15000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| logging | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| discord_bulk_delete_messagesA | Delete 2 to 100 messages from a guild channel in one request. The whole request fails if any message is older than 14 days or any message ID is duplicated. To delete a single message instead use discord_delete_message. Bot permissions it may need: View Channel, Manage Messages. Destructive: the user is asked to approve the exact change before it runs. |
| discord_create_pinA | Pin a message in a channel or thread so it appears in the channel's pinned list. Use it to keep an important message easy to find; use discord_list_pins to see what is pinned and discord_delete_pin to unpin. Returns pinned: true with the channel and message IDs. Bot permissions it may need: View Channel, Pin Messages. Changes Discord data; safe to retry. |
| discord_crosspost_messageA | Publish a message posted in an announcement channel (type 5) so Discord copies it into every channel that follows that channel. Use it after posting with discord_send_message in an announcement channel; regular text channels cannot be crossposted, and a message can be published only once, so a second call fails. Manage Messages is only needed for messages the bot did not send. Returns the published message. Bot permissions it may need: View Channel, Send Messages, Manage Messages. Changes Discord data and is not idempotent; check the result before retrying. |
| discord_delete_messageA | Permanently delete a single message from a channel or thread. To delete between 2 and 100 recent messages at once use discord_bulk_delete_messages. Returns a confirmation object with the deleted message and channel IDs. Bot permissions it may need: View Channel, Manage Messages. Destructive: the user is asked to approve the exact change before it runs. |
| discord_delete_pinA | Unpin a pinned message from a channel or thread. To add a pin use discord_create_pin, and to list all current pinned messages use discord_list_pins. Returns a confirmation object with the unpinned message and channel IDs. Bot permissions it may need: View Channel, Pin Messages. Changes or removes existing Discord data without an approval prompt. |
| discord_download_attachmentA | Download a message attachment from Discord into the local download folder (DISCORD_MCP_DOWNLOAD_DIR, default ~/Downloads/discord-mcp). Requires the message ID and the specific attachment ID (attachment_id comes from the attachments of discord_get_message). Returns local file path, size, content type and SHA-256 hash. Bot permissions it may need: View Channel, Read Message History. Writes a file to the local download folder and changes nothing in Discord. |
| discord_edit_messageA | Edit a message the bot sent: replace its content or embeds, add uploaded files, and change the description or spoiler flag of existing attachments. Existing attachments are always kept; they cannot be removed with this tool. Discord only lets a bot edit its own messages; to post a new message use discord_send_message. Returns the updated message. Bot permissions it may need: View Channel, Read Message History, Attach Files, Embed Links. Changes or removes existing Discord data without an approval prompt. |
| discord_end_pollA | End a poll the bot created before its duration runs out. Discord does not let a bot end polls posted by other users. Returns the message with the poll; Discord finishes the final vote count in the background, so read the final tally later with discord_get_message once poll.results.is_finalized is true. Bot permissions it may need: View Channel. Changes or removes existing Discord data without an approval prompt. |
| discord_get_messageA | Fetch one message by ID from a channel or thread, with its author, content, attachments, embeds, reactions and poll. Use it when you already have the message ID; to read recent history use discord_list_messages, and to find messages by text use discord_search_guild_messages. Bot permissions it may need: View Channel, Read Message History. Read-only; safe to retry. |
| discord_get_my_userA | Fetch the bot's own user object: id, username, global name, avatar, banner and flags. Use it to confirm which account the token belongs to; to look up any other user by ID use discord_get_user. Returns the user object. No special bot permissions. Read-only; safe to retry. |
| discord_get_userA | Fetch any Discord user by user ID: username, global name, avatar, banner, accent color and whether the account is a bot. Use it to resolve an ID taken from a message author, a mention or a poll voter; for the bot's own account use discord_get_my_user, and for guild data such as nickname, roles and join date use discord_get_guild_member (members toolset). Returns the user object. No special bot permissions. Read-only; safe to retry. |
| discord_leave_guildA | Remove the authenticated bot from a guild by server ID. The bot ceases to be a member immediately and requires a new invite URL with bot scopes to rejoin. Use this when the bot is instructed to depart a server; to kick another member use discord_delete_guild_member (members toolset). Returns deleted: true and the guild ID. No special bot permissions. Destructive: the user is asked to approve the exact change before it runs. |
| discord_list_messagesA | List messages from a channel or thread, newest first. Provide before, after, or around snowflake IDs to paginate or center the search window. To fetch a specific message by ID use discord_get_message, and to search messages by text or author across an entire server use discord_search_guild_messages. Page older messages with before=next_before. Bot permissions it may need: View Channel, Read Message History. Read-only; safe to retry. |
| discord_list_my_connectionsA | List the external accounts (for example GitHub, Twitch, YouTube, Steam) linked to the account behind the credential, with each connection's name, type, verified flag and visibility. Discord requires an OAuth2 token with the connections scope for this endpoint, so a plain bot token can be refused; to list the guilds the bot is in use discord_list_my_guilds. Returns the connections array. No special bot permissions. Read-only; safe to retry. |
| discord_list_my_guildsA | List the Discord guilds (servers) the authenticated bot account belongs to. Use this to discover available guild IDs before calling guild-scoped tools, or to check membership counts. Page older results with before and newer results with after. Under DISCORD_MCP_ALLOWED_GUILDS, paging parameters must be omitted; every allowed guild is returned in a single call. Returns partial guild objects plus next_before and next_after cursors; both are set only when the page is full, so a full page can be followed by an empty one, and both are null when the page holds fewer guilds than limit. No special bot permissions. Read-only; safe to retry. |
| discord_list_pinsA | List the pinned messages of a channel or thread, newest pin first, each with its pin time. To pin a message use discord_create_pin, and to unpin use discord_delete_pin. Page with before=next_before while has_more is true. Bot permissions it may need: View Channel, Read Message History. Read-only; safe to retry. |
| discord_list_poll_answer_votersA | Get a paginated list of users that voted for a specific answer on a poll message. Use it after fetching a poll message with discord_get_message to see who selected each answer. Page subsequent voters with after=next_after. Bot permissions it may need: View Channel, Read Message History. Read-only; safe to retry. |
| discord_search_guild_messagesA | Search messages across a whole guild by text and filters (author, channel, mentions, attachments, links, embeds, pinned state, message ID range). Use discord_list_messages to read one channel in order. Results come back newest first by default; a page can hold fewer than limit, so page with offset=next_offset until it is null. A new or busy guild index can answer "not ready"; the tool then fails with a retryable error that carries the retry delay in seconds. Results omit reactions. Bot permissions it may need: View Channel, Read Message History. Read-only; safe to retry. |
| discord_send_messageA | Send a message to a channel or thread. It can carry text, embeds, a poll, files from the local machine, a reply to an existing message, stickers (up to 3) and flags (suppress embeds, silent). At least one of content, embeds, sticker_ids, files or poll is required. Mentions do not ping unless allowed_mentions permits it. To change a message already sent use discord_edit_message. A retry without the same nonce posts a second message. Bot permissions it may need: View Channel, Send Messages, Attach Files, Embed Links, Send Polls, Send TTS Messages, Read Message History, Send Messages in Threads, Use External Stickers, Mention Everyone. Changes Discord data and is not idempotent; check the result before retrying. |
| discord_trigger_typing_indicatorA | Show the typing indicator in a channel or thread for 10 seconds, for a bot that needs a few seconds to prepare an answer. Discord advises most bots not to use it. To post the reply use discord_send_message. Bot permissions it may need: View Channel, Send Messages, Send Messages in Threads. Changes Discord data and is not idempotent; check the result before retrying. |
| discord_update_my_userA | Update the authenticated bot's global username, avatar image, or banner image. Changes apply globally across every server the bot is in. Changing the username can randomize the discriminator. To change the bot's nickname or avatar in one guild only, use discord_update_my_guild_member (members toolset). Returns the updated bot user object. No special bot permissions. Destructive: the user is asked to approve the exact change before it runs. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 21 tools
Every tool targets a distinct resource+action, and the descriptions actively cross-reference siblings to steer the agent (delete_message vs bulk_delete_messages, get_message vs list_messages vs search_guild_messages, get_my_user vs get_user, create_pin vs list_pins vs delete_pin). Even the easily-conflated pairs are explicitly disambiguated with 'use X instead' guidance. No two tools appear to do the same thing.
All 21 tools follow the discord_verb_noun snake_case pattern (discord_send_message, discord_list_pins, discord_bulk_delete_messages), with only the stable 'my' qualifier (get_my_user, list_my_guilds) used consistently for self-scoped operations. No camelCase or mixed-convention drift.
At 21 tools this is slightly heavy for a single toolset, but the surface covers a genuinely broad domain (messages, attachments, pins, polls, users, guild membership) and no tool is a redundant wrapper or trivial duplicate. It is at the upper edge of well-scoped rather than bloated.
Message lifecycle (send, edit, delete, bulk delete, get, list, search, crosspost) plus pins and polls is well covered, but core messaging operations are missing: there is no way to add or remove reactions even though get_message and search return reaction data, and no thread creation despite threads being accepted as targets. Minor gaps (no embed-only helper, no message-forward) are workaroundable, but reactions/threads are notable dead ends.