Discord MCP Ultimate
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DISCORD_TOKEN | Yes | Bot token. Never commit it. | |
| DISCORD_MCP_TOOLSETS | No | Comma-separated toolset names to expose. Unset or 'all' exposes everything. Names: discovery, messages, channels, permissions, members, roles, moderation, screening, stats, forums, webhooks, scheduled_events, invites, dm, guild_settings, bot_profile, style, architect, automod, expressions, backup, diagnostics, scheduler. | |
| DISCORD_GUILD_MEMBERS | No | Request the Server Members intent. Set false if the portal toggle is off, or the connection closes with code 4014. | true |
| DISCORD_ALLOWED_GUILDS | No | Comma-separated guild IDs. When set, calls outside the list are rejected at parse time. | |
| DISCORD_MESSAGE_CONTENT | No | Request the Message Content intent. Set false for a purely administrative agent — it removes message-body reading entirely. | true |
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 | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| discord_list_guildsA | List every Discord server (guild) the bot is a member of (id, name, member count, icon). Takes no arguments. Read-only. Start here to discover the guild_id needed by most other tools. |
| discord_get_guild_infoA | Get details about one server: name, description, member/channel/role counts, boost tier, owner, and creation date. Read-only. Use discord_get_server_stats for a finer breakdown (humans vs bots, channel types). |
| discord_list_channelsA | List all channels in a server, grouped by their parent category and ordered by position. Returns a JSON object keyed by category name. Read-only. Use discord_find_channel_by_name to locate a specific channel. |
| discord_find_channel_by_nameA | Find channels whose name contains a substring (case-insensitive). Returns matching channels (id, name, type) as a JSON array. Read-only. Useful for resolving a channel_id when you only know the channel's name. |
| discord_read_messagesA | Read messages from a text channel or thread, oldest-to-newest. Page backwards by re-calling with before set to the id of the oldest message you received, which walks a channel past the 100-message per-call cap. Requires the View Channel and Read Message History permissions. Returns { messages: [...] } with id, author, content, timestamp, attachment count, pinned flag. Use discord_search_messages to filter by keyword, or discord_fetch_pinned_messages for pinned messages only. |
| discord_send_messageA | Send a plain-text message to a channel or thread. For rich content (title, color, fields, images) use discord_send_embed; to attach a reply reference to an existing message use discord_reply_message. Requires the bot to have the Send Messages permission. Returns the new message ID. |
| discord_send_pollA | Send a native Discord poll to a channel. Discord renders it with its own vote UI and tallies the results, so no third-party poll bot is needed. Requires the Send Polls permission. Returns the poll message ID and its answer labels. |
| discord_reply_messageA | Reply to a specific message, attaching a reply reference so clients show it as a threaded reply. Use discord_send_message for a standalone message with no reference. Requires the Send Messages permission. Returns the new reply's message ID. |
| discord_edit_messageA | Edit the text content of a message previously sent by this bot. Discord forbids editing other users' messages, so this fails for non-bot messages. Use discord_edit_embed for embed messages. Works in text channels and threads. Returns the edited message ID. |
| discord_add_reactionA | Add a single emoji reaction to a message as the bot. Requires the Add Reactions and Read Message History permissions. Use discord_remove_reactions to undo. Idempotent: re-adding the bot's existing reaction has no effect. |
| discord_create_threadA | Create a thread, either branching from an existing message (pass message_id) or as a standalone thread in a text channel (omit message_id). Standalone creation requires a parent text channel and fails if channel_id is itself a thread. Requires the Create Public Threads permission. Returns the new thread's ID. |
| discord_bulk_delete_messagesA | Permanently delete multiple recent messages in one call. IRREVERSIBLE. SAFE BY DEFAULT: dry_run is true unless explicitly set to false, so call it first to preview, then re-call with dry_run:false to actually delete. Discord only allows bulk-deleting messages younger than 14 days; older ones are skipped. Requires the Manage Messages permission. Returns the number deleted. |
| discord_send_embedA | Send a single rich embed (title, description, color, fields, author, footer, images, timestamp). Use discord_send_message for plain text, or discord_send_multiple_embeds to send several embeds at once. Requires the Send Messages and Embed Links permissions. Returns the new message ID. |
| discord_edit_embedA | Replace the embed on a message previously sent by this bot. Only this bot's messages can be edited. This is a full replace, not a merge: provided fields are applied and omitted fields are dropped from the embed. Returns a confirmation. |
| discord_send_multiple_embedsA | Send up to 10 embeds in a single message, with optional text above them. Use discord_send_embed for a single embed. Requires the Send Messages and Embed Links permissions. Returns the new message ID. |
| discord_delete_messageA | Permanently delete one specific message. IRREVERSIBLE. The bot can always delete its own messages; deleting another user's message requires the Manage Messages permission. Use discord_bulk_delete_messages to remove many at once. An optional reason is recorded in the audit log. |
| discord_pin_messageA | Pin or unpin a message in a channel, controlled by the pin flag. Requires the Pin Messages permission (a dedicated permission since early 2026, separate from Manage Messages). A channel holds at most 50 pins. Idempotent: pinning an already-pinned message (or unpinning an unpinned one) has no additional effect. |
| discord_search_messagesA | Keyword search over a channel's recent messages using case-insensitive substring matching. Scans only up to the last 100 messages; it does not search full history. Returns { matches: [...] } with id, author, content, timestamp. Use discord_read_messages to fetch recent messages without filtering. |
| discord_search_guild_messagesA | Search for messages across all channels in a guild using Discord's native search API. Returns messages matching the query with channel context. Requires READ_MESSAGE_HISTORY permission. Use discord_search_messages for channel-specific search. |
| discord_crosspost_messageA | Publish (crosspost) a message from an Announcement channel to every server that follows it. Only works in announcement channels on a message that has not already been published. Requires the Send Messages permission (and Manage Messages for messages authored by others). Returns a confirmation. |
| discord_remove_reactionsA | Remove reactions from a message. With no emoji: removes ALL reactions. With emoji only: removes every reaction of that emoji. With emoji and user_id: removes that one user's reaction. Removing all reactions or another user's reaction requires the Manage Messages permission. Use discord_add_reaction to add. |
| discord_get_reactionsA | List the users who reacted to a message with a specific emoji. Returns { reactions: [...] } with id, username, bot flag. Read-only. |
| discord_get_message_attachmentsA | List the file attachments of a message. Returns { attachments: [...] } with id, filename, title (the original name when Discord strips non-ASCII from filename), url, proxyUrl, contentType, size in bytes, width, height, alt-text description, voice-message duration and waveform, spoiler flag. Discord signs CDN urls with a 24-hour expiry and does not re-sign on every fetch; re-call this tool if a stored url has expired. Requires the View Channel and Read Message History permissions. Read-only. Use discord_read_messages to find messages with attachments. |
| discord_fetch_pinned_messagesA | List all pinned messages in a channel. Returns { messages: [...] } with id, author, content, timestamp, pinnedAt. Read-only. Use discord_pin_message to change which messages are pinned. |
| discord_forward_messageA | Forward an existing message to another channel using Discord's native forward, which preserves the original attribution. Works across text channels and threads. Use discord_send_message to compose new content instead. Requires the Send Messages permission in the target channel. Returns a confirmation. |
| discord_create_channelA | Create a text channel, voice channel, or category in a server. Requires the Manage Channels permission. For forum channels use discord_create_forum_channel instead. Returns the new channel's name and ID. |
| discord_delete_channelA | Permanently delete a channel and all of its messages. IRREVERSIBLE. SAFE BY DEFAULT: dry_run is true unless explicitly set to false, so call it first to preview, then re-call with dry_run:false to actually delete. Requires the Manage Channels permission. An optional reason is recorded in the audit log. |
| discord_edit_channelA | Update a channel's name, topic, slowmode, or NSFW flag. Only provided fields change; topic and slowmode apply to text channels only. Requires the Manage Channels permission. Returns a confirmation. |
| discord_move_channelA | Move a channel into a category, or remove it from its category when category_id is omitted. Requires the Manage Channels permission. Use discord_set_channel_position to reorder within a category. Returns a confirmation. |
| discord_clone_channelA | Create a copy of a channel, including its name, topic, and permission overwrites (but not its messages). Requires the Manage Channels permission. Returns the cloned channel's name and ID. |
| discord_set_channel_positionA | Set a channel's display order within its category. Use discord_move_channel to change which category it belongs to. Requires the Manage Channels permission. Returns a confirmation. |
| discord_follow_announcement_channelA | Subscribe a target channel to an announcement (news) channel, so the source's published messages are reposted into the target. The source must be an announcement channel. Requires the Manage Webhooks permission in the target. Returns a confirmation. |
| discord_lock_channel_permissionsA | Reset a channel's permission overwrites to exactly match its parent category (Discord's 'sync permissions'). The channel must be inside a category. Requires the Manage Roles permission. Returns a confirmation. |
| discord_get_channel_permissionsA | List every permission overwrite on a channel, per role and per member, with the allowed and denied permission flags for each. Read-only. Use discord_audit_permissions for a server-wide report across all channels. |
| discord_set_role_permissionA | Add or update a per-channel permission overwrite for a role, allowing and/or denying specific permissions. Merges with the role's existing overwrite (does not reset it). Denying View Channel to @everyone also locks the bot out unless it holds an allow overwrite of its own; grant that with discord_set_member_permission before the deny. Requires the Manage Roles permission. Use discord_set_member_permission to target a single member instead. |
| discord_set_member_permissionA | Add or update a per-channel permission overwrite for a single member, allowing and/or denying specific permissions. Merges with the member's existing overwrite. Requires the Manage Roles permission. Use discord_set_role_permission to target a whole role instead. |
| discord_reset_channel_permissionsA | Remove ALL permission overwrites on a channel, so only role/server-level permissions apply. Does NOT re-sync with the category; use discord_lock_channel_permissions for that. IRREVERSIBLE: the cleared overwrites cannot be recovered. Requires the Manage Roles permission. |
| discord_copy_permissionsA | Replace the target channel's permission overwrites with a copy of the source channel's. The target's existing overwrites are overwritten. Requires the Manage Roles permission. Returns a confirmation. |
| discord_audit_permissionsA | Generate a server-wide permission report: for every channel that has overwrites, lists each role/member and their allowed/denied permissions (entity names resolved). Read-only. Returns { channels: [...] } with channel, channelId, overwrites. Use discord_get_channel_permissions for a single channel. |
| discord_list_membersA | List members of a server with their roles, ordered by user ID. Returns { members: [...], nextCursor }. A page holds up to 1000 members; if nextCursor is non-null, pass it back as |
| discord_get_member_infoA | Get full details for one server member: roles, effective permissions, account/join dates, bot flag, and current timeout status. Read-only. Returns a JSON object. |
| discord_kick_memberA | Remove a member from the server. They can rejoin with a new invite (unlike a ban). Requires the Kick Members permission, and the bot's top role must be higher than the target's. Use discord_ban_member to block re-entry. The reason is recorded in the audit log. |
| discord_ban_memberA | Ban a user from the server, blocking re-entry until unbanned. Optionally bulk-deletes their recent messages. Requires the Ban Members permission, and the bot's top role must outrank the target's. Use discord_unban_member to reverse, or discord_kick_member for a non-permanent removal. The reason is recorded in the audit log. |
| discord_unban_memberA | Lift a ban so the user may rejoin via a new invite. Requires the Ban Members permission. Reverses discord_ban_member. The reason is recorded in the audit log. |
| discord_timeout_memberA | Mute a member for a set duration (Discord 'timeout'): they cannot send messages, react, or speak until it expires. Pass duration_minutes = 0 to remove an active timeout early. Max 28 days (40320 minutes). Requires the Moderate Members permission. |
| discord_search_membersA | Find server members whose username or nickname starts with a query string (prefix match). Returns { members: [...] } with id, username, nickname, roles. Use discord_list_members to page through everyone. Read-only. |
| discord_set_nicknameA | Set or clear a member's server nickname. Pass null (or the string 'null') to clear it. Requires the Manage Nicknames permission (or Change Nickname for the bot itself). The reason is recorded in the audit log. |
| discord_list_bansA | List the users banned from the server, with their ban reasons. Returns { bans: [...], nextCursor }. A page holds up to 1000 bans; if nextCursor is non-null, pass it back as |
| discord_bulk_banA | Ban many users in a single call, intended for raid mitigation. SAFE BY DEFAULT: dry_run is true unless explicitly set to false, so call it first to preview the exact list of user IDs that would be banned, then re-call with dry_run:false to actually ban them. Requires both the Ban Members and Manage Server permissions. Returns counts of banned vs failed users; Discord rejects the whole call with an error if no user could be banned. Use discord_ban_member for a single ban with finer control. |
| discord_prune_membersA | Remove members who have been inactive (no roles, not seen) for a number of days. SAFE BY DEFAULT: dry_run is true unless explicitly set to false, so call it first to preview the count, then re-call with dry_run:false to actually remove them. Removal is irreversible (members must rejoin). Requires the Kick Members permission. |
| discord_list_rolesA | List all roles in a server (excluding @everyone), highest-first, with color, position, member count, and permissions. Read-only. Returns { roles: [...] }. Use discord_get_role_members to see who holds a given role. |
| discord_create_roleA | Create a new role in a server. Requires the Manage Roles permission; the new role is placed below the bot's highest role. Use discord_add_role to then assign it to members. Returns the new role's name and ID. |
| discord_edit_roleA | Update an existing role's name, color, permissions, hoist, or mentionable flag. Only provided fields change; passing permissions REPLACES the role's full permission set. Requires the Manage Roles permission, and the role must be below the bot's highest role. |
| discord_delete_roleA | Permanently delete a role from the server; it is automatically removed from every member who held it. IRREVERSIBLE. Requires the Manage Roles permission, and the role must be below the bot's highest role. |
| discord_add_roleA | Assign an existing role to a member. Requires the Manage Roles permission, and the role must be below the bot's highest role. Idempotent: assigning a role the member already has has no effect. Use discord_remove_role to undo. |
| discord_remove_roleA | Remove a role from a member. Requires the Manage Roles permission, and the role must be below the bot's highest role. Idempotent: removing a role the member doesn't have has no effect. Reverses discord_add_role. |
| discord_get_role_membersA | List members who currently hold a specific role, scanning up to 20,000 members. Returns { members: [...], truncated }; check |
| discord_set_role_positionA | Move a role up or down in the server's role hierarchy, which determines permission precedence and member-list ordering. Higher position = higher in the list. Requires the Manage Roles permission, and the target position must be below the bot's highest role. |
| discord_set_role_iconA | Set or clear a role's icon, either a custom image or a unicode emoji. Requires the server to be Boost Level 2+ (the ROLE_ICONS feature) and the Manage Roles permission. Pass null to either field to remove that icon. Returns a confirmation. |
| discord_get_audit_logA | Fetch the server's audit log, the record of administrative actions (bans, kicks, role/channel changes, etc.) with who performed them and when. Requires the View Audit Log permission. Returns { entries: [...] } with id, action, executor, target, reason, createdAt. Read-only. |
| discord_get_membership_screeningA | Fetch the server's membership screening form, the rules/questions new members must accept before gaining access. Requires the server to have the Community feature enabled. Read-only. Returns the form as JSON, including its version. |
| discord_update_membership_screeningA | Update the server's membership screening form: set the welcome description and the rules new members must agree to. Only provided fields change. Requires the Community feature and the Manage Server permission. Returns the updated form. |
| discord_get_server_statsA | Get a snapshot of server metrics: total members (humans vs cached bots), channel breakdown (text/voice/category), role count, boost tier and count, and creation date. Read-only. Returns a JSON object. Note: bots are counted from the member cache only, so botsInCache is a lower bound and humans (total minus cached bots) an upper bound. |
| discord_get_forum_channelsA | List the forum channels in a server (id, name, topic, parent category). Read-only. Use discord_get_forum_tags to see a forum's available tags, or discord_list_forum_threads for its posts. |
| discord_create_forum_channelA | Create a new forum channel in a server. A forum holds posts (threads) rather than a linear message feed. Requires the Manage Channels permission. Use discord_create_channel for text/voice channels instead. Returns the new channel's name and ID. |
| discord_create_forum_postA | Create a new post (a thread with a starter message) in a forum channel. Requires the Send Messages and Create Public Threads permissions. Use discord_reply_to_forum to add follow-up messages. Returns the new post's name and thread ID. |
| discord_get_forum_postA | Get a forum post's details (title, archived/locked state, applied tags, message count) plus its recent messages, oldest-to-newest. Read-only. Pass the post's thread_id. Returns a JSON object. |
| discord_list_forum_threadsA | List posts in a forum channel. Returns { threads: [...], hasMore, nextBefore }. The first call (no |
| discord_reply_to_forumA | Post a follow-up message inside an existing forum post (thread). Requires the Send Messages in Threads permission (shown as 'Send Messages in Posts' for forums). Use discord_create_forum_post to start a new post instead. Returns the new message ID. |
| discord_delete_forum_postA | Permanently delete a forum post (thread) and all its messages. IRREVERSIBLE. To merely close it without deleting, use discord_update_forum_post with archived:true. Requires the Manage Threads permission. |
| discord_get_forum_tagsA | List the tags available on a forum channel (id, name, emoji, moderated flag). Read-only. Use these IDs with discord_create_forum_post or discord_update_forum_post; manage the tag set with discord_set_forum_tags. |
| discord_set_forum_tagsA | Replace the full set of available tags on a forum channel with the provided list. This overwrites existing tags, so include every tag you want to keep. Requires the Manage Channels permission. Returns a confirmation. |
| discord_update_forum_postA | Update a forum post's title, archived/locked state, or applied tags. Only provided fields change; passing applied_tags replaces the post's tags. Set archived:true to close a post without deleting it. Requires the Manage Threads permission. |
| discord_create_webhookA | Create a webhook on a channel and return its ID and token. SECURITY: the returned token grants anyone the ability to post as this webhook without authentication; treat it as a secret. Requires the Manage Webhooks permission. Use the returned id+token with discord_send_webhook_message. |
| discord_send_webhook_messageA | Send a message through a webhook using its ID and token (no bot permissions needed; the token authorizes the send). Supports per-message username/avatar overrides and up to 10 embeds. At least one of content or embeds is required. Returns the new message ID. |
| discord_edit_webhookA | Update a webhook's name, avatar, or the channel it posts to. Only provided fields change. Requires the Manage Webhooks permission. Returns a confirmation. |
| discord_delete_webhookA | Permanently delete a webhook by its ID, invalidating its token. IRREVERSIBLE: any integrations using the old token will stop working. Requires the Manage Webhooks permission. |
| discord_list_webhooksA | List the webhooks in a single channel or across a whole server (id, name, channel, token when visible, creator). Provide exactly one of channel_id or guild_id. Requires the Manage Webhooks permission. Read-only. |
| discord_edit_webhook_messageA | Edit a message previously sent through a webhook, using the webhook's ID and token. Replaces the provided fields. Requires the original webhook token. Returns a confirmation. |
| discord_delete_webhook_messageA | Permanently delete a message that was sent through a webhook, using the webhook's ID and token. IRREVERSIBLE. Requires the original webhook token. |
| discord_fetch_webhook_messageA | Fetch a single message sent through a webhook (id, content, embed count, timestamp), using the webhook's ID and token. Read-only. Requires the original webhook token. |
| discord_list_scheduled_eventsA | List all scheduled events in a server (id, name, status, type, time, location, interested count). Read-only. Use discord_get_scheduled_event for one event's full details. |
| discord_get_scheduled_eventA | Get full details for one scheduled event: name, description, status, type, channel/location, start/end times, creator, and interested-user count. Read-only. Returns a JSON object. |
| discord_create_scheduled_eventA | Create a scheduled event. For 'VOICE'/'STAGE_INSTANCE' events provide channel_id; for 'EXTERNAL' events provide location AND scheduled_end_time. Requires the Manage Events permission. Returns the new event's name and ID. |
| discord_edit_scheduled_eventA | Update a scheduled event; only provided fields change. Use the status field to start ('ACTIVE'), end ('COMPLETED'), or cancel ('CANCELED') an event; Discord only allows certain status transitions. Requires the Manage Events permission. |
| discord_delete_scheduled_eventA | Permanently delete a scheduled event. IRREVERSIBLE. To cancel an event while keeping a record, use discord_edit_scheduled_event with status:'CANCELED' instead. Requires the Manage Events permission. |
| discord_get_event_subscribersA | List the users who marked themselves 'Interested' in a scheduled event. Returns { subscribers: [...], nextCursor }. A page holds up to 100 users; if nextCursor is non-null, pass it back as |
| discord_create_event_inviteA | Create a shareable invite URL that points to a scheduled event, so recipients land on the event when joining. Requires the Create Instant Invite permission. Returns the invite URL. |
| discord_list_invitesA | List all active invites across a server (code, url, channel, inviter, uses, expiry). Requires the Manage Server permission. Read-only. Use discord_list_channel_invites to scope to one channel. |
| discord_get_inviteA | Look up a single invite by its code: target server and channel, inviter, and expiry. Works for any public invite, but this endpoint never returns usage counters (uses/max_uses/max_age read 0); use discord_list_invites or discord_list_channel_invites for real counters. Read-only. Returns a JSON object. |
| discord_create_inviteA | Create an invite link for a channel, optionally limiting its lifetime, uses, and membership type. SECURITY: anyone with the returned link can join the server. Requires the Create Instant Invite permission. Returns the invite URL and code. |
| discord_delete_inviteA | Revoke an invite by its code so it can no longer be used. IRREVERSIBLE (the code is freed). Requires the Manage Channels permission (or Manage Server). The reason is recorded in the audit log. |
| discord_list_channel_invitesA | List the active invites that point to one specific channel. Unlike discord_list_invites (server-wide), this scopes results to a single channel. Requires the Manage Channels permission. Read-only. |
| discord_send_dmA | Send a private direct message to a user by their user ID. Use discord_send_message to post in a server channel instead. Requires the bot to share at least one server with the user, and the user must allow DMs from server members (otherwise Discord rejects the send). Returns the new message ID. |
| discord_send_dm_embedA | Send a rich embed as a private direct message to a user. Use discord_send_dm for plain text, or discord_send_embed to post an embed in a channel. Requires the bot to share a server with the user, and the user must allow DMs from server members. Returns the new message ID. |
| discord_edit_dmA | Edit the text content of a DM message previously sent by this bot. Only the bot's own DM messages can be edited. Use discord_edit_dm_embed for embed messages. Returns a confirmation. |
| discord_edit_dm_embedA | Replace the embed on a DM message previously sent by this bot. Only the bot's own messages can be edited. Full replace, not merge: provided fields are applied and omitted fields are dropped. Returns a confirmation. |
| discord_delete_dmA | Permanently delete a DM message previously sent by this bot. IRREVERSIBLE. The bot can only delete its own DM messages, not the recipient's. Returns a confirmation. |
| discord_read_dmsA | Read the most recent messages from the bot's DM conversation with a user, oldest-to-newest. Returns { messages: [...] } with id, author, content, embed count, timestamp. Read-only. |
| discord_reply_dmA | Reply to a specific message in a DM, attaching a quoted reply reference. Unlike the edit/delete DM tools, this works on any message in the conversation (the bot's or the user's). Use discord_send_dm for a standalone DM with no reference. Returns the new reply's message ID. |
| discord_get_guild_settingsA | Read every server-level setting in one call: name, description, icon/banner/splash URLs, owner, preferred locale, verification level, explicit content filter, default notification level, MFA requirement, NSFW level, boost tier, system/rules/public-updates/safety-alerts/AFK channel slots, AFK timeout, the full feature list, whether Community is enabled, and the vanity URL code. Read-only. Use this before any change so you know the current values, and use the targeted discord_set_* tools to change them. |
| discord_set_guild_nameA | Change the server's name. This is the guild name shown at the top of the server list, not the bot's own name and not the bot's nickname in this server (use discord_set_bot_nickname for that). Requires Manage Server. Returns the previous and new name. |
| discord_set_guild_iconA | Replace the server's icon (the square image shown next to the server name). This is the guild icon; the bot's own avatar is changed with discord_set_bot_avatar. Accepts an https URL, a data: URI or base64. Requires Manage Server. Discord rejects images that are not PNG, JPEG, GIF or WebP or that exceed 10 MB. Returns the new icon URL. |
| discord_remove_guild_iconA | Remove the server's icon, reverting to Discord's generated default. Requires Manage Server. This is not reversible: the previous image is gone. Returns the guild ID. |
| discord_set_guild_bannerA | Set or replace the server's banner, the wide image shown at the top of the server's landing page. IMPORTANT LIMITATION: Discord only renders a guild banner when the server has the BANNER feature (boost level 2+). Without it, Discord rejects the call with an error rather than accepting and hiding it. Requires Manage Server. Returns the new banner URL. |
| discord_remove_guild_bannerA | Remove the server's banner. Requires Manage Server and the BANNER feature (boost level 2+). Not reversible. Returns the guild ID. |
| discord_set_guild_descriptionA | Set or clear the server's description (the blurb shown on the server's landing page and in discovery). IMPORTANT LIMITATION: Discord only accepts a guild description when the server has the COMMUNITY feature. On a server without it, the call is rejected: call discord_enable_community first, or accept that this field cannot be set. Requires Manage Server. Pass null to clear it. |
| discord_set_guild_splashA | Set or remove the server's invite splash, the background shown on the invite page. Requires the INVITE_SPLASH feature (boost level 1+) and Manage Server. Pass null to remove it. Returns the new splash URL. |
| discord_set_guild_safetyA | Update the server's safety and moderation settings in one call: verification level, explicit content filter, default notification level, and the age-restricted (NSFW) content gate. Only provided fields change. Setting verification_level to high or very_high requires the server to be verified or partnered, otherwise Discord rejects it. Requires Manage Server. Returns the applied values. |
| discord_set_guild_channelsA | Point the server's special channel slots at specific channels: the AFK channel and timeout, the system channel (where join/boost notices post), the rules channel, the public updates channel, and the safety alerts channel. Only provided slots change. The rules, public-updates and safety-alerts slots require the COMMUNITY feature; Discord rejects them otherwise. AFK must be a voice channel. Requires Manage Server. Returns the resulting slot IDs. |
| discord_set_system_channel_noticesA | Toggle which automatic notices the system channel posts: join notifications, join-notification replies, boost/boost-tier messages, the 'server setup tips' reminder, and role-subscription purchase messages. Only provided flags change. Requires Manage Server. Returns the resulting flag set. |
| discord_set_guild_localeA | Set the server's preferred language, which controls the language of Discord's own system messages and the default for members who have not chosen one. Requires Manage Server. Returns the previous and new locale. |
| discord_set_premium_progress_barA | Show or hide the boost progress bar in the server's channel list. Requires Manage Server. Returns the resulting value. |
| discord_enable_communityA | Turn the Community feature on or off for the server. COMMUNITY is the prerequisite for rules and public-updates channels, membership screening, the welcome screen, onboarding and AutoMod. LIMITATION: Discord requires the server to already have a rules channel and a public-updates channel before Community can be enabled, so create those first (discord_create_channel, then discord_set_guild_channels). Requires Manage Server. Returns the resulting feature list. |
| discord_get_guild_featuresA | List the server's feature flags with a plain-language explanation of the ones that gate this server's tools (COMMUNITY, DISCOVERABLE, BANNER, INVITE_SPLASH, VANITY_URL, ANIMATED_ICON, ANIMATED_BANNER, ROLE_ICONS, NEWS, FORUM_CHANNEL_ENABLED, MEMBER_VERIFICATION_GATE_ENABLED, AUTO_MODERATION) and which are currently active. Also reports which settings are therefore editable. Read-only. Use this before attempting a setting that may be feature-gated. |
| discord_get_guild_previewA | Fetch the public preview of a server: approximate member and online counts, description, icon, splash, emojis, stickers and features. Works without being a member, but Discord only serves a rich preview for servers that are discoverable or have Community enabled. Read-only. |
| discord_get_guild_vanity_urlA | Read the server's vanity invite URL, the custom discord.gg link. Requires the VANITY_URL feature. Read-only. Use discord_get_guild_features to check whether the feature is active first. |
| discord_set_guild_widgetA | Configure the server's embeddable widget: whether it is enabled and which channel it exposes. Enabling the widget publishes a live member list and online count to anyone with the widget URL, so treat it as a privacy decision. Requires Manage Server. Returns the resulting settings. Use discord_get_guild_widget to read the current state and the public URLs. |
| discord_get_guild_widgetA | Read the server's widget settings and, when the widget is enabled, the public widget.json and widget image URLs. The JSON endpoint is readable by anyone who has the URL, so this tool reports exactly what it exposes. Read-only. |
| discord_get_welcome_screenA | Read the server's welcome screen: whether it is enabled, its description, and the channels it recommends with their emoji and descriptions. Requires the COMMUNITY feature. Read-only. Use discord_set_welcome_screen to change it. |
| discord_set_welcome_screenA | Configure the server's welcome screen: enable or disable it, set the headline description, and list the recommended channels with a one-line blurb each. Requires the COMMUNITY feature and Manage Server. LIMITATION: Discord requires the description to be non-empty and at least one recommended channel when the screen is enabled. Replaces the channel list wholesale when provided. Returns the resulting screen. |
| discord_get_onboardingA | Read the server's onboarding configuration: whether it is enabled, its mode (default or advanced), the default channels new members land in, and every onboarding prompt with its options, each option's channels and roles. Requires the COMMUNITY feature. Read-only. Use discord_set_onboarding to change it. |
| discord_set_onboardingA | Configure the server's onboarding flow: enable or disable it, pick the default channels new members see, and define the prompts with their options (each option can grant roles and point at channels). Requires the COMMUNITY feature and Manage Server. LIMITATION: Discord requires at least seven default channels and one prompt with at least one option for advanced mode; an incomplete configuration is rejected. Replaces the prompt list wholesale when provided. Returns the resulting configuration. |
| discord_get_bot_permissionsA | Report what this bot can and cannot do in a server: its server-wide permissions, its role position versus the server owner, and whether it holds each permission the other tools in this server depend on. Read-only. Call this when a tool fails with 'Missing permissions' to find out which permission to grant. |
| discord_set_membership_gateA | Turn the membership screening gate on or off by adding or removing the MEMBER_VERIFICATION_GATE_ENABLED feature. LIMITATION, verified against a live server: Discord returns HTTP 200 but silently ignores an API request to ADD this feature, so enabling it from here does not work. It must be turned on once by hand in the Discord client (Server Settings > Safety Setup > Membership Screening). Disabling it through this tool does work. The returned 'enabled' field always reflects the real state after the call, so treat enabled:false as Discord having refused. Requires the COMMUNITY feature and Manage Server. |
| discord_get_bot_identityA | Report the bot's own identity, distinguishing the things that are commonly confused: its global username and avatar (which apply in every server), its per-server nickname and per-server avatar in this guild, and the owning application's name and ID. Read-only. Use this before changing anything so you know which of the four you actually mean. |
| discord_set_bot_nicknameA | Change the bot's own nickname in one server. This is per-server: it does not affect the bot's name in other servers, nor its global username. Pass null to clear the nickname and fall back to the global username. Requires the Change Nickname permission for the bot itself, or Manage Nicknames if changing on its own behalf is restricted. Returns the previous and new nickname. |
| discord_set_bot_avatarA | Change the bot's global avatar. This applies in every server and in DMs, and is not the same as the server's icon (discord_set_guild_icon) or the bot's per-server avatar (discord_set_bot_guild_avatar). Accepts an https URL, data: URI or base64; PNG, JPEG, GIF or WebP up to 10 MB. Returns the new avatar URL. WARNING: Discord rate-limits this endpoint; repeated calls will be throttled. |
| discord_set_bot_guild_avatarA | Set the bot's per-server avatar, which overrides the global avatar in that one server. Requires the server to have the BANNER or ROLE_ICONS-adjacent boost feature set that Discord requires for per-guild member avatars; on a server without it Discord rejects the call. Accepts an https URL, data: URI or base64. Pass null to clear it and fall back to the global avatar. Returns the resulting per-server avatar URL. |
| discord_set_bot_usernameA | Change the bot's global username. WARNING: this is the most rate-limited endpoint Discord offers (roughly two changes per hour), it applies in every server, and Discord may reject names that are taken or reserved. If the call is throttled it will fail with a 429 and you must wait. This does not change the server name or the bot's nickname. Returns the new username. |
| discord_set_application_iconA | Change the owning application's icon, which is what Discord shows in the OAuth2 authorization screen and in the developer portal. This is a different image from the bot's avatar and from the server icon. Requires the application to be owned by the token's owner. Accepts an https URL, data: URI or base64. Returns the new icon URL. |
| discord_set_application_descriptionA | Change the owning application's description, shown on the OAuth2 authorization screen and in the developer portal. This is not the server's description (discord_set_guild_description). Requires the application to be owned by the token's owner. Returns the new description. |
| discord_get_bot_profile_limitsA | Explain, from the live client state, exactly which parts of the bot's profile this server can and cannot change, and why. Read-only. Use this when asked to change the bot's banner, its 'about me', or anything else Discord does not expose to bot accounts: the answer is a documented limitation, not a missing tool. |
| discord_list_name_stylesA | List the available Unicode name styles (minimal, gaming, cyberpunk, futuristic, luxury, fantasy, anime, elegant, geometric, bordered, emoji_lead, fullwidth) with a description of each. Read-only, no arguments. Note: these styles decorate text with Unicode characters; Discord does not support applying a custom font to channel, category or role names. Use discord_style_name to preview the result for a specific name. |
| discord_style_nameA | Generate styled variants of one name for a Discord channel, category, forum, or role. Returns one variant per requested style (or every style when none is given). Uses Unicode decorative characters only: this decorates the text, it does not change the font Discord renders, because Discord has no per-server font setting. Empty or punctuation-only input falls back to a readable default name. Use discord_style_preview to plan a whole server at once. |
| discord_style_previewA | Build a coherent naming plan for a whole server: a shared theme plus per-entity names for categories, text/voice/forum/announcement/rules/support/community channels, and roles. Returns the exact names that would be used, any duplicate names (Discord allows them, but they become indistinguishable in the channel list), and any truncation or fallback that occurred. Read-only: nothing is created or renamed. Use discord_apply_name_theme to actually rename existing entities. These names are decorated text, not a font. |
| discord_apply_name_themeA | Rename existing channels, categories and roles in a server to a Unicode-styled theme. PREVIEWS BY DEFAULT: returns the exact rename list without changing anything. Re-call with confirm:true to apply. Renames are applied one at a time and a failure on one entity does not stop the rest; per-entity results are returned. Requires Manage Channels (and Manage Roles for roles). This changes name text only: Discord cannot apply a custom font. Renaming a channel does not change its ID, so existing links keep working. |
| discord_architect_planA | Validate and normalise a server-structure plan without touching Discord. Takes a declarative plan (roles, categories, channels, permission intents) and returns the exact ordered steps that discord_architect_apply would execute, plus any problem in the plan (duplicate names, unknown role keys, unsupported field combinations). Read-only. This is the tool to call first for any 'build me a server' request: it is the cheapest way to show the user what would happen. The plan is declarative, not a script: re-applying it converges on the described state instead of duplicating entities. |
| discord_architect_read_structureA | Read the live server structure in the same shape a plan uses: categories with their channels, uncategorised channels, and roles. Use this to see what exists before building, or to hand the result back to a model that will propose a plan. Read-only. |
| discord_architect_compareA | Diff a plan against the live server: which roles, categories and channels are missing (would be created), which already exist, and which exist on the server but are absent from the plan (candidates for removal, never removed automatically). Read-only. Use this to answer 'what would change?' or to detect drift before repairing a half-finished build. |
| discord_architect_applyA | Build a plan against the live server. PREVIEWS BY DEFAULT: returns the step list without changing anything; re-call with confirm:true to apply. Idempotent by name: a role, category or channel that already exists with the planned name is skipped rather than duplicated, so a re-run after a failure repairs the server instead of doubling it. Steps run in order (roles, then categories, then channels) and one failing step does not stop the rest: per-step results are returned so the build can be resumed. Requires Manage Channels and Manage Roles. A duplicate-suppression window rejects an identical plan re-submitted within 60 seconds. This creates structure inside an existing server; it cannot create a new Discord server (see discord_architect_explain_limits). |
| discord_architect_repairA | Resume an interrupted build: compares a plan against the live server and reports exactly which steps are still missing, then optionally applies just those. Use this after discord_architect_apply reports failures, or when a build was interrupted. PREVIEWS BY DEFAULT; confirm:true applies the missing steps only. Read-only when confirm is false. |
| discord_architect_explain_limitsA | Explain what this server can and cannot do about creating Discord servers, with the API reason. Read-only. Use this when asked to 'create a new server': a bot token cannot create a guild. GET /users/@me/guilds and POST /guilds are restricted, so the documented path is: create the server manually (or from a template), invite the bot, then build the structure inside it with discord_architect_apply. |
| discord_architect_create_templateA | Create a Discord guild template from the current server, capturing its channels, roles and permissions as a shareable code. Requires Manage Server. IMPORTANT: the code can only be used to create a new guild by a human in the Discord client; a bot cannot apply a template to create a guild. Returns the template code and shareable URL. |
| discord_architect_list_templatesA | List the guild templates this server has created, with their codes, sync status and update times. Read-only. |
| discord_architect_delete_templateA | Delete a guild template by its code. Requires Manage Server. Not reversible: the template code stops working immediately for anyone who has it. Returns a confirmation. |
| discord_architect_delete_structureA | Delete channels, categories and roles from a server, driven by a plan (everything in the plan is removed) or by explicit IDs. IRREVERSIBLE: deleted channels lose their message history permanently, and deleted roles are removed from every member. REQUIRES the literal confirmation string "CONFIRM DELETE"; without it the tool returns a preview and deletes nothing. Deletes are performed one at a time and per-entity failures are reported. Requires Manage Channels and Manage Roles. |
| discord_list_automod_rulesA | List every AutoMod rule in a server: its name, enabled state, trigger type and event type, the keyword/regex/preset lists, the allow list, mention limits, exempt roles and channels, and the configured actions. Requires the Manage Server permission (Discord gates the AutoMod endpoints on it). Read-only. Use discord_get_automod_rule for one rule. |
| discord_get_automod_ruleA | Fetch one AutoMod rule by ID with its full trigger configuration and actions. Requires Manage Server. Read-only. |
| discord_create_automod_ruleA | Create an AutoMod rule. Requires Manage Server (Discord gates AutoMod on it) and the server to have the AutoModeration feature, which arrives with Community. Trigger types: 'keyword' (keyword_filter + optional regex_patterns), 'keyword_preset' (Discord's built-in profanity/sexual_content/slurs lists), 'spam', 'mention_spam' (mention_total_limit), 'member_profile' (blocks suspicious profile text). Actions: block_message, send_alert_message (needs channel_id), timeout (needs duration_seconds), block_member_interaction. Returns the created rule. |
| discord_edit_automod_ruleA | Update an AutoMod rule: rename it, enable or disable it, replace its trigger metadata or actions, or change its exemptions. Only provided fields change; trigger_type cannot be changed after creation (Discord does not allow it), so delete and recreate to switch trigger type. Requires Manage Server. Returns the updated rule. |
| discord_delete_automod_ruleA | Delete an AutoMod rule. IRREVERSIBLE: the rule and its configuration are gone. Requires Manage Server. There is no preview: deleting an AutoMod rule cannot lose member data, and Discord does not offer an undo, so the tool reports exactly which rule was removed. |
| discord_apply_automod_baselineA | Create a sensible baseline of AutoMod rules for a community server in one call: block Discord invite links, block common scam/phishing keywords, block mention spam, and time out repeat offenders. PREVIEWS BY DEFAULT: returns the rules that would be created without creating them; re-call with confirm:true to apply. Rules that already exist by name are skipped, so re-running is safe. Requires Manage Server and the AutoModeration feature (Community). |
| discord_list_emojisA | List every custom emoji in a server with its ID, name, whether it is animated, its image URL, and the roles it is restricted to (empty means usable by everyone). Read-only. |
| discord_create_emojiA | Upload a new custom emoji to the server. The name must be 2–32 characters using only letters, digits and underscores (Discord's rule). Accepts an https URL, data: URI or base64 image: PNG, JPEG, GIF or WebP, up to 256 KB for emojis. Requires Manage Expressions. Discord also caps the total number of emojis by boost tier, and rejects the upload with a clear error once the cap is reached. Returns the created emoji. |
| discord_edit_emojiA | Rename a custom emoji or change which roles may use it. Only provided fields change. Requires Manage Expressions. Passing role_ids replaces the whole restriction list; pass an empty array to open the emoji to everyone. Returns the updated emoji. |
| discord_delete_emojiA | Delete a custom emoji. IRREVERSIBLE: the image is gone and every message that used :name: shows as an unknown emoji from then on. Requires Manage Expressions. Managed emojis (created by an integration) cannot be deleted by a bot and Discord will reject the call. Returns the deleted emoji's name. |
| discord_list_stickersA | List the server's custom stickers with their ID, name, description, tags, format and image URL. Read-only. |
| discord_create_stickerA | Upload a custom sticker to the server. Discord accepts PNG, APNG and Lottie (JSON) stickers here; GIF stickers are not accepted at upload. The name is 2–30 characters and the tags string is a comma-separated list used for search. Requires Manage Expressions, and Discord caps the sticker count by boost tier. Returns the created sticker. |
| discord_edit_stickerA | Update a custom sticker's name, description or tags. Only provided fields change. Requires Manage Expressions. The image itself cannot be changed: Discord has no endpoint for it, so delete and re-upload to replace the artwork. Returns the updated sticker. |
| discord_delete_stickerA | Delete a custom sticker from the server. IRREVERSIBLE: the artwork is gone and messages that used it lose the image. Requires Manage Expressions. Standard (Discord-provided) stickers cannot be deleted; this tool only removes guild stickers. Returns the deleted sticker's name. |
| discord_export_structureA | Export the server's structure as a portable JSON backup: every category and channel with its type, position, topic, slowmode and permission overwrites, plus every role with its permissions. LIMITATION, stated plainly: this backs up structure and permissions, NOT messages. Discord's API cannot enumerate a channel's full history in one call, and this server does not pretend otherwise. The output is a plain JSON document the caller can store; nothing is written to disk by the server. Requires no special permission beyond being able to read the guild. Read-only. |
| discord_compare_structureA | Diff a structure backup against the live server and report what changed: channels and categories present in one but not the other, roles added or removed, and permission overwrites that differ. Read-only. Use this to answer 'what changed since the backup?' or to check drift before restoring. |
| discord_restore_structureA | Restore a structure backup into a server. PREVIEWS BY DEFAULT: returns exactly what would be created; re-call with confirm:true to apply. ADDITIVE ONLY: it creates roles, categories and channels that are missing and never deletes or renames anything, because a restore that removes entities turns a stale backup into a wipe. Permission overwrites are re-applied by matching role NAMES from the backup to the live server's roles; member-specific overwrites are skipped, since user IDs differ across servers. Requires Manage Channels and Manage Roles. |
| discord_explain_permissionsA | Explain a member's effective permissions in a channel, using Discord's own resolution (base role permissions, then category and channel overwrites, in Discord's order). Reports the resulting allow set, which flags came from overwrites, and any permission that is denied. Read-only. This is the tool to use when someone 'cannot see' or 'cannot post' and the cause is not obvious. |
| discord_check_tool_permissionsA | Given a guild and a list of tool names, report for each whether the bot currently holds the permissions that tool needs, and whether the target channel is visible to it. Read-only. Use this before a multi-step operation to fail early with an actionable message instead of partway through. |
| discord_find_permission_problemsA | Scan a server for permission problems and return each with a fix: channels the bot cannot see, channels where @everyone was denied ViewChannel but the bot has no compensating allow (a classic lockout), overwrites that deny Send Messages to @everyone in channels that look public, roles with Administrator that are not the bot's own, and members whose highest role is above the bot's. Read-only. |
| discord_diagnose_configurationA | Diagnose the server's configuration end to end: the bot's permission baseline, Community prerequisites, the AFK/system/rules channel slots, per-channel bot visibility, role hierarchy, AutoMod presence, intents, and the env flags in effect. Each finding carries a concrete fix. Read-only. Run this first when something behaves unexpectedly. |
| discord_read_audit_trailA | Read this MCP server's own record of what it changed: every mutating tool call, when it ran, which guild it targeted, whether it was applied or only previewed, and whether it failed. This is NOT Discord's audit log (use discord_get_audit_log for that); it is the server's in-memory trail, capped at the 500 most recent entries and lost when the process restarts. Read-only. Use it to answer 'what did the bot just do?'. |
| discord_verify_setupA | Check that the MCP server itself is correctly installed and connected: whether DISCORD_TOKEN is set (reported as a boolean, never echoed), which gateway intents are requested, which toolsets are exposed and how many tools that yields, whether the Discord client reached READY, and the gateway ping. Read-only, takes no arguments. Run this first when the MCP server appears not to work at all. |
| discord_schedule_messageA | Schedule a message to be sent to a channel after a delay, optionally repeating. IMPORTANT LIMITATION: the timer runs inside this MCP server process, so it fires only while the server is running and is lost when it stops. For a post that must survive a restart, use a durable scheduler (cron, a CI workflow, or an OpenHands automation) that calls discord_send_message instead. Returns the task ID and the time of the next run. |
| discord_list_scheduled_tasksA | List the messages currently scheduled in this MCP server process, with their channel, next run time, run count and last error. Read-only. Because these timers are in-process, the list is empty after a restart. |
| discord_cancel_scheduled_taskA | Cancel a scheduled message by its task ID. The message will not be sent again. Returns whether the task existed. Only affects tasks created in this server process; a durable external scheduler is not reachable from here. |
| discord_publish_announcementA | Publish a structured announcement to a channel in one call: a title, a body, optional fields, a colour, and an optional ping target. Builds the embed for you so the layout is consistent, and lets you choose the mention policy explicitly instead of relying on the default. SAFE BY DEFAULT for mentions: no mention is parsed unless you pass ping (so '@everyone' inside the body never actually pings). If the channel is an announcement channel and crosspost is true, the message is also published to followers. Requires Send Messages (and Manage Messages to crosspost others' messages). |
| discord_create_reaction_role_menuA | Attach one or more emoji→role mappings to a message so members self-assign roles by reacting. Posts a menu embed, adds each reaction, and records the mappings the bot process reads. The bot must be running ( |
| discord_list_reaction_role_menusA | List the reaction-role mappings on disk, optionally filtered to one guild. These are the mappings the bot process will honour; a mapping whose role or message was deleted is still listed, so check it before trusting it. |
| discord_delete_reaction_role_menuA | Remove every reaction-role mapping attached to one message. The message itself is left alone. Returns the number of mappings removed, so a call that matched nothing is visible as 0 rather than as success. |
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 177 tools
Most tools carry explicit disambiguation hints ('use X instead of Y'), which rescues an otherwise extremely crowded surface. However there are many genuinely near-neighbour clusters — get_guild_info / get_server_stats / get_guild_settings / get_guild_preview / get_guild_features, and read_messages / search_messages / search_guild_messages / fetch_pinned_messages, and send_message / send_embed / send_multiple_embeds / reply_message / send_webhook_message / publish_announcement — that an agent must read carefully to pick correctly. Boundaries are documented but not self-evident from names alone.
Uniform discord_ prefix plus snake_case resource_action throughout, including a coherent discord_architect_* sub-namespace. The only wobble is verb drift for reads (list_ vs get_ vs fetch_ vs read_ vs explain_ vs verify_) and a few nouns that encode sub-resources (send_dm vs send_message, edit_dm_embed vs edit_embed), but the pattern is highly readable and predictable.
177 tools for one server is an extreme mismatch: no agent can reliably select from this surface, and much of it is long-tail (stickers, per-server bot avatars, application icon, reaction-role menus, styled Unicode names). The domain is genuinely large, but this should be split into toolsets (channels, members, permissions, guild settings, automod, build/architect) rather than a single flat list.
Coverage is unusually thorough — CRUD for channels, messages, threads/forums, members, roles, invites, webhooks, scheduled events, AutoMod, emoji/sticker, guild settings, onboarding, plus diagnostics, structure backup/restore and a declarative build pipeline. Remaining gaps are interactions/message components, slash-command registration, and voice/stage moderation, plus explicitly documented platform limits (no guild creation, no message-history export).