discord-mcp
This MCP server connects an AI assistant to Discord through a user-owned bot, enabling reading, messaging, moderation, and server administration.
Discover servers and channels: List guilds, get server details, list channels/categories, and find channels by name.
Read and search messages: Read channel/thread history, search recent or guild-wide messages, fetch pinned messages, reactions, and attachments.
Send and manage messages: Send/reply/edit/delete messages, send rich embeds, react, pin, crosspost, forward, and bulk-delete spam safely with dry-run previews.
Manage channels and permissions: Create/delete/edit/move/clone channels, set positions, sync permissions, inspect and modify role/member permission overwrites, and audit permissions server-wide.
Moderate members: List/search members, set nicknames, kick, ban, unban, bulk-ban, timeout, and prune inactive members—destructive actions include dry-run defaults where relevant.
Manage roles: List/create/edit/delete roles, assign/remove roles, change hierarchy positions, and set role icons.
Work with forums: Create forums, posts, replies, tags; list threads and update or delete posts.
Manage webhooks: Create, list, edit, delete webhooks and send/edit/delete/fetch webhook messages.
Run scheduled events: Create, edit, cancel, delete events, list interested subscribers, and create event-linked invites.
Manage invites and DMs: List/create/revoke invites, and send/read/reply/edit/delete direct messages.
Audit and report: Fetch audit logs, view membership screening, update screening rules, and get server statistics.
Provides comprehensive management of Discord servers, including tools for messaging, channel and role configuration, member moderation, forum interactions, and webhook management.
discord-mcp connects Claude, Codex, Cursor, VS Code and any other MCP client to your Discord server through your own bot. Ask in plain language: your assistant reads channels, answers, moderates, and manages roles, channels, forums and events, with 100 tools behind it.
See it in action
Calls made live with Claude Code on a demo server; the panel summarizes their results. The Discord window shows real captures, except that the spot of each new message or post stays blank until it appears.
Related MCP server: MCP Discord
What you can ask
You want to | Ask your assistant |
Catch up on a busy channel | "Summarize what's going on in #support and post a recap in #mod-log." |
Turn feedback into a tracker | "Open a bug-tracker forum and file the two open bugs from the recap." |
Stop a spam raid safely | "A spam raid just hit #general. Preview the cleanup, then remove it." |
Run community events | "Schedule a community call next Friday at 8 PM and announce it in #announcements." |
Audit permissions | "Show me every permission overwrite in the server." |
Welcome people | "Create an invite to #welcome that expires in 24 hours." |
Automate notifications | "Create a webhook on #deploys and post the release notes as an embed." |
Quick start
Create a bot. In the Discord Developer Portal, create an application, open Bot, then Reset Token and copy it. On the same page, enable Server Members Intent and Message Content Intent.
Invite it to your server. Replace
YOUR_CLIENT_IDwith the Application ID from General Information, then open the link:https://discord.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&scope=bot&permissions=2270827458424055It requests the permissions the tools use. Remove the ones you do not need in the authorization screen.
Add it to your client. Use a button above, or paste this into your client's MCP config:
{ "mcpServers": { "discord": { "command": "npx", "args": ["-y", "@pasympa/discord-mcp"], "env": { "DISCORD_TOKEN": "YOUR_BOT_TOKEN" } } } }
npx downloads and runs the server (Node.js 22 or later); nothing else to install. Per-client instructions are under Clients.
Expose only what you need
The full set of 100 tools costs about 32k tokens of context when a client loads them all. Most assistants need a fraction of it: set DISCORD_MCP_TOOLSETS to the toolsets you want.
Profile |
| Tools | Context |
Everything (default) | unset | 100 | ~32k tokens |
Chat assistant |
| 25 | ~9k tokens |
Community manager |
| 42 | ~15k tokens |
Moderator |
| 31 | ~9k tokens |
Audit and stats |
| 6 | ~2k tokens |
"env": {
"DISCORD_TOKEN": "YOUR_BOT_TOKEN",
"DISCORD_MCP_TOOLSETS": "discovery,messages"
}Context sizes are measured on the tools/list response (bytes divided by 4). Toolsets: discovery, messages, channels, permissions, members (includes kick, ban and timeout), roles, moderation (the audit log), screening, stats, forums, webhooks, scheduled_events, invites, dm. A toolset brings its whole module, destructive tools included; an unknown name stops the server at startup instead of exposing everything.
Set DISCORD_MCP_READ_ONLY=true to keep only the 35 tools annotated readOnlyHint: true, about 13k tokens. It narrows DISCORD_MCP_TOOLSETS instead of replacing it: discovery,messages then exposes 11 tools, about 5k tokens. A selection with no read-only tool left, such as channels alone, stops the server at startup.
Safety
Your bot, your permissions. The server can only do what the bot's Discord permissions allow.
Preview before mass actions.
discord_bulk_delete_messages,discord_bulk_ban,discord_prune_membersanddiscord_delete_channelrun as a dry run by default and report what would happen. Passdry_run: falseto apply.Stay in your servers.
DISCORD_ALLOWED_GUILDSrestricts every call to the guilds you list, whether the target is addressed by guild, channel, thread, webhook or invite.Clear annotations. Every tool declares
readOnlyHint, and every write tool declaresdestructiveHint, so clients can approve reads automatically and ask before destructive calls.Read-only mode. With
DISCORD_MCP_READ_ONLY=true, the server lists only the tools that declarereadOnlyHint: true. A call to any other tool fails as an unknown tool. Two reads stay sensitive.discord_list_webhooksreturns webhook tokens, and a token lets anyone post through its webhook without this server.discord_read_dmsreads the bot's direct messages with a user. To hide both, leavewebhooksanddmout ofDISCORD_MCP_TOOLSETS.Keep the token out of files. Prefer your client's secret prompt (the VS Code button asks for the token) over a config file you might commit.
Clients
Bundle. Download discord-mcp.mcpb from the latest release and open it. Claude Desktop shows an install screen: enter the bot token there. The other settings are optional and match Configuration. The bundle runs on the Node.js built into Claude Desktop, so there is nothing else to install.
On Windows, the file may not open in Claude Desktop. Install it from Settings > Extensions > Advanced settings > Install Extension instead.
After you change a setting, quit and reopen Claude Desktop.
The bundle does not update itself. After each release, download and open the new
discord-mcp.mcpb.
Config file. Or add the config from Quick start to claude_desktop_config.json, then restart Claude Desktop.
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
claude mcp add discord -e DISCORD_TOKEN=YOUR_BOT_TOKEN -- npx -y @pasympa/discord-mcpUse the Install in Cursor button, then replace YOUR_BOT_TOKEN. Or add the config from Quick start to ~/.cursor/mcp.json. See the Cursor MCP docs.
Use the Install in VS Code button: VS Code asks for the token and stores it as a secret. Or add this to .vscode/mcp.json:
{
"inputs": [
{
"type": "promptString",
"id": "discord_token",
"description": "Discord bot token",
"password": true
}
],
"servers": {
"discord": {
"command": "npx",
"args": ["-y", "@pasympa/discord-mcp"],
"env": {
"DISCORD_TOKEN": "${input:discord_token}"
}
}
}
}See the VS Code MCP docs.
Add the config from Quick start to ~/.codeium/windsurf/mcp_config.json, then refresh the MCP servers list.
codex mcp add discord --env DISCORD_TOKEN=YOUR_BOT_TOKEN -- npx -y @pasympa/discord-mcpOpen MCP Servers, then Configure, and add the config from Quick start to cline_mcp_settings.json.
{
"mcpServers": {
"discord": {
"command": "docker",
"args": ["run", "--rm", "-i", "-e", "DISCORD_TOKEN", "pasympa/discord-mcp:latest"],
"env": {
"DISCORD_TOKEN": "YOUR_BOT_TOKEN"
}
}
}
}git clone https://github.com/PaSympa/discord-mcp
cd discord-mcp
npm install && npm run build{
"mcpServers": {
"discord": {
"command": "node",
"args": ["/absolute/path/to/discord-mcp/dist/index.js"],
"env": {
"DISCORD_TOKEN": "YOUR_BOT_TOKEN"
}
}
}
}You can also put DISCORD_TOKEN=YOUR_BOT_TOKEN in a .env file at the project root; the server loads it on start.
Remote clients over HTTP
The OpenAI Responses API, Codex and n8n can reach an MCP server by URL instead of starting it. For them, the server can run as a Streamable HTTP endpoint, protected by a static bearer token:
export DISCORD_TOKEN=YOUR_BOT_TOKEN
export DISCORD_MCP_HTTP_TOKEN="$(openssl rand -hex 32)"
DISCORD_MCP_TRANSPORT=http npx -y @pasympa/discord-mcpThe endpoint is http://127.0.0.1:3000/mcp. Every request must carry Authorization: Bearer <DISCORD_MCP_HTTP_TOKEN>. Toolsets, read-only mode and DISCORD_ALLOWED_GUILDS apply as on stdio.
The token is static: there is no OAuth, so this mode sits outside the MCP authorization spec. ChatGPT connectors need OAuth 2.1 or OpenAI's Secure MCP Tunnel, so this mode is not for ChatGPT.
In Docker, the server must listen on 0.0.0.0 inside the container. Publish the port on the host loopback only:
docker run --rm -p 127.0.0.1:3000:3000 \
-e DISCORD_TOKEN -e DISCORD_MCP_HTTP_TOKEN \
-e DISCORD_MCP_TRANSPORT=http -e DISCORD_MCP_HTTP_HOST=0.0.0.0 \
pasympa/discord-mcp:latestThe calls come from OpenAI's servers, so the endpoint must be reachable over public HTTPS, behind a reverse proxy or a tunnel. OpenAI does not keep the headers: send them with every request.
curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "YOUR_MODEL",
"input": "List my Discord servers.",
"tools": [{
"type": "mcp",
"server_label": "discord",
"server_url": "https://discord-mcp.example.com/mcp",
"headers": { "Authorization": "Bearer YOUR_DISCORD_MCP_HTTP_TOKEN" },
"require_approval": { "never": { "read_only": true } },
"allowed_tools": ["discord_list_guilds", "discord_read_messages"]
}]
}'With this require_approval, only the tools annotated readOnlyHint: true run without approval. See the OpenAI MCP guide.
Codex runs on your machine, so the local URL works. In ~/.codex/config.toml:
[mcp_servers.discord]
url = "http://127.0.0.1:3000/mcp"
bearer_token_env_var = "DISCORD_MCP_HTTP_TOKEN"Or run codex mcp add discord --url http://127.0.0.1:3000/mcp --bearer-token-env-var DISCORD_MCP_HTTP_TOKEN. Codex reads the token from that variable in its own environment. See the Codex MCP docs.
Add an MCP Client Tool node to an AI Agent:
Endpoint:
http://127.0.0.1:3000/mcpServer Transport: HTTP Streamable
Authentication: Header Auth, with a credential whose Name is
Authorizationand Value isBearer YOUR_DISCORD_MCP_HTTP_TOKEN
When n8n runs in Docker, 127.0.0.1 is the n8n container itself. Run the server in a container on the same Docker network, use http://CONTAINER_NAME:3000/mcp as the endpoint, and add the container name to DISCORD_MCP_HTTP_ALLOWED_HOSTS. n8n Cloud needs a public HTTPS URL. See the n8n MCP Client Tool docs.
Security over HTTP
Bind address. The default,
127.0.0.1, accepts connections from this machine only. Use0.0.0.0only inside a container, with the port published on127.0.0.1.Token. Use at least 32 characters:
openssl rand -hex 32gives 64. Anyone who holds it acts as your bot, with the same toolsets, read-only mode and allow-list. To rotate it, restart the server with a new value.HTTPS. The server speaks plain HTTP. To reach it from another machine, put it behind a reverse proxy or a tunnel that terminates TLS. Never publish the port on the Internet: the token would travel in clear text.
Allowed hosts. A request needs a
Hostoflocalhost,127.0.0.1,[::1]or a name inDISCORD_MCP_HTTP_ALLOWED_HOSTS. Any request with anOriginheader is refused, so a web page cannot reach the server, even through DNS rebinding. nginx forwards its upstream address by default, which passes. Caddy forwards the public hostname: list it.Stateless. Each POST to
/mcpstands alone, and GET and DELETE answer405. If a client drops the connection during a call, the Discord action still completes, so a retry can repeat a write.
Configuration
Variable | Default | Description |
| none | Required. Bot token. |
|
| Comma-separated toolsets to expose (see Expose only what you need). Unset, empty or |
|
| Set to |
| all | Comma-separated guild IDs the server may act on. Calls that target any other guild are rejected, whether addressed by guild ID, channel ID, thread ID, webhook or invite code. |
|
| Set to |
|
| Set to |
|
|
|
| none | Required in http mode. Bearer token every request must carry: at least 32 characters from the RFC 6750 b64token alphabet (letters, digits, |
|
| Address to listen on in http mode. |
|
| Port to listen on in http mode. |
| none | Comma-separated hostnames, without port, accepted in the |
The intent flags only change what the bot requests when it connects. Requesting a privileged intent that is not enabled in the Developer Portal closes the connection with code 4014; set the flag to false to connect anyway. What the tools can read is governed by the portal toggles: every message is fetched over the REST API, which Discord gates on the portal setting alone. With Message Content off in the portal, message bodies come back empty (content, embeds, attachments), except the bot's own messages, DMs and messages that mention the bot; with Server Members off, member listing fails.
Tools
100 tools in 14 toolsets. Each one documents its permissions, side effects and return shape in its description.
Tool | Description |
| List all servers the bot is connected to |
| Get detailed guild info (name, members, channels, roles, boosts) |
| List all channels in a guild grouped by category |
| Find a channel by name (partial match) |
Tool | Description |
| Read messages, paging back through history |
| Send a plain text message |
| Reply to a specific message |
| Edit a message sent by the bot |
| Delete a specific message |
| Add a reaction emoji to a message |
| Remove reactions (all, by emoji, or by user) |
| List users who reacted with a specific emoji |
| Create a thread from a message or standalone |
| List a text channel's threads, paged |
| Delete multiple messages at once (2-100) |
| Send a rich embed with all options |
| Edit an embed previously sent by the bot |
| Send up to 10 embeds in a single message |
| Pin or unpin a message |
| List a message's attachments with download urls |
| List a channel's pinned messages, paged |
| Search messages by keyword (last 100) |
| Search across every channel using Discord's search index |
| Publish a message to announcement channel followers |
| Forward a message to another channel |
Tool | Description |
| Create a text, voice channel or category |
| Delete a channel |
| Edit name, topic, slowmode, NSFW flag |
| Move a channel into/out of a category |
| Clone a channel with its permissions |
| Set display position within a category |
| Follow an announcement channel |
| Sync permissions with parent category |
Tool | Description |
| List all permission overwrites on a channel |
| Allow/deny permissions for a role on a channel |
| Allow/deny permissions for a member on a channel |
| Remove all overwrites (reset to inherited) |
| Copy overwrites from one channel to another |
| Full permission audit for all channels |
Tool | Description |
| List guild members with their roles |
| Detailed member info (roles, permissions, join date) |
| Search members by username or nickname |
| Set or clear a member's nickname |
| Kick a member |
| Ban a member (optionally delete recent messages) |
| Unban a user |
| Ban multiple users at once (raid mitigation) |
| List all banned users |
| Timeout a member (0 to remove) |
| Remove inactive members (with dry run) |
Tool | Description |
| List all roles with permissions and member count |
| Create a new role |
| Edit a role (name, color, permissions, hoist, mentionable) |
| Delete a role |
| Assign a role to a member |
| Remove a role from a member |
| List all members with a specific role |
| Change a role's position in the hierarchy |
| Set a custom icon or unicode emoji on a role |
Tool | Description |
| List all forum channels in a guild |
| Create a new forum channel |
| Create a post/thread in a forum |
| Get a post's details and messages |
| List threads (active + archived) |
| Reply to a forum post |
| Delete a forum thread |
| Get available tags |
| Set/update tags on a forum |
| Update title, archived, locked, tags |
Tool | Description |
| Create a webhook on a channel |
| Send via webhook (custom username/avatar, embeds) |
| Edit a webhook's name, avatar, or channel |
| Delete a webhook |
| List webhooks for a channel or guild |
| Edit a message sent by a webhook |
| Delete a message sent by a webhook |
| Fetch a specific webhook message |
Tool | Description |
| List all scheduled events in a guild |
| Get detailed info about a scheduled event |
| Create a voice, stage, or external event |
| Edit an existing scheduled event |
| Delete a scheduled event |
| Get users who marked "Interested" |
| Create an invite linked to an event |
Tool | Description |
| Send a direct message to a user by their user ID |
| Send an embed in a DM to a user |
| Read message history from a DM conversation |
| Reply to a specific DM message |
| Edit a previously sent DM (text) |
| Edit a previously sent DM embed |
| Delete a DM message |
Tool | Description |
| List all active invites in a guild |
| List invites for a specific channel |
| Get details about an invite by its code |
| Create an invite link for a channel |
| Revoke an invite |
Tool | Description |
| Fetch the guild audit log |
| Get the membership screening form |
| Update screening rules for new members |
| Server stats: members, channels, roles, boost level |
Troubleshooting
Every call fails with close code
4014. The bot requests a privileged intent that is off in the Developer Portal. Enable Server Members and Message Content there, or setDISCORD_GUILD_MEMBERS=false/DISCORD_MESSAGE_CONTENT=false.Messages come back with empty text. Message Content is off in the portal. Enable it; the flag alone does not change what the REST API returns.
A channel reads as empty. The bot lacks Read Message History there: Discord returns an empty list rather than an error.
Missing AccessorMissing Permissions. The bot cannot see the channel, or the target role or member sits above the bot's highest role. Check overwrites withdiscord_get_channel_permissions.Finding IDs. Enable Developer Mode in Discord (Settings, Advanced), then right-click a server, channel or user and choose Copy ID.
Contributing
Contributions are welcome. CONTRIBUTING.md covers the module layout, the tool definition quality bar and the release flow. Report vulnerabilities as described in SECURITY.md.
License
MIT, see LICENSE. discord-mcp is an independent open-source project, not affiliated with or endorsed by Discord Inc.
VS Code and VS Code Insiders icons: Codicons © Microsoft Corporation, licensed under CC BY 4.0.
Available Tools
100 toolsdiscord_add_reactionAIdempotent
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.
Inputs: emoji (required), channel_id (required), message_id (required).
discord_add_roleAIdempotent
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.
Inputs: role_id (required), user_id (required), guild_id (required), reason.
discord_audit_permissionsARead-only
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.
Inputs: guild_id (required). Returns: channels
discord_ban_memberADestructiveIdempotent
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.
Inputs: user_id (required), guild_id (required), reason, delete_message_days.
discord_bulk_banADestructive
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.
Inputs: guild_id (required), user_ids (required), reason, dry_run, +1 more.
discord_bulk_delete_messagesADestructive
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.
Inputs: count (required), channel_id (required), dry_run.
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.
Inputs: channel_id (required), new_name.
discord_copy_permissionsADestructiveIdempotent
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. To create a new channel with the same overwrites, use discord_clone_channel; to remove them all, use discord_reset_channel_permissions.
Inputs: source_channel_id (required), target_channel_id (required), reason.
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.
Inputs: name (required), guild_id (required), type, topic, +1 more.
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. EXTERNAL events need channel_id; other events reject it and use their own channel. For a plain channel invite with no event attached, use discord_create_invite.
Inputs: event_id (required), guild_id (required), max_age, max_uses, +1 more.
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.
Inputs: name (required), guild_id (required), topic, category_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.
Inputs: title (required), content (required), forum_channel_id (required), applied_tags.
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.
Inputs: channel_id (required), unique, max_age, max_uses, +1 more.
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. To change an existing role, use discord_edit_role.
Inputs: name (required), guild_id (required), color, hoist, +2 more.
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. To change, start or cancel an existing event, use discord_edit_scheduled_event.
Inputs: name (required), guild_id (required), entity_type (required), scheduled_start_time (required), +5 more.
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.
Inputs: name (required), channel_id (required), message_id, auto_archive_duration.
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.
Inputs: name (required), channel_id (required), avatar.
discord_crosspost_messageAIdempotent
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.
Inputs: channel_id (required), message_id (required).
discord_delete_channelADestructive
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.
Inputs: channel_id (required), reason, dry_run.
discord_delete_dmADestructive
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.
Inputs: user_id (required), message_id (required).
discord_delete_forum_postADestructive
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.
Inputs: thread_id (required).
discord_delete_inviteADestructive
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.
Inputs: invite_code (required), reason.
discord_delete_messageADestructive
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.
Inputs: channel_id (required), message_id (required), reason.
discord_delete_roleADestructive
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.
Inputs: role_id (required), guild_id (required), reason.
discord_delete_scheduled_eventADestructive
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.
Inputs: event_id (required), guild_id (required).
discord_delete_webhookADestructive
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. To remove one message the webhook sent, use discord_delete_webhook_message instead; discord_list_webhooks finds the ID.
Inputs: webhook_id (required).
discord_delete_webhook_messageADestructive
Permanently delete a message that was sent through a webhook, using the webhook's ID and token. IRREVERSIBLE. No bot permission is needed: the token authorizes the call. To delete the webhook itself, use discord_delete_webhook.
Inputs: message_id (required), webhook_id (required), webhook_token (required).
discord_edit_channelAIdempotent
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.
Inputs: channel_id (required), name, nsfw, topic, +1 more.
discord_edit_dmAIdempotent
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.
Inputs: content (required), user_id (required), message_id (required).
discord_edit_dm_embedAIdempotent
Replace the embed on a DM message previously sent by this bot. Full replace, not merge: provided fields are applied and omitted fields are dropped. Omitting content keeps the message's current text. Use discord_edit_dm to change only the text, or discord_edit_embed for a message in a server channel. Returns a confirmation.
Inputs: user_id (required), message_id (required), url, color, +9 more.
discord_edit_embedAIdempotent
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.
Inputs: channel_id (required), message_id (required), url, color, +8 more.
discord_edit_messageAIdempotent
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.
Inputs: content (required), channel_id (required), message_id (required).
discord_edit_roleAIdempotent
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.
Inputs: role_id (required), guild_id (required), name, color, +3 more.
discord_edit_scheduled_eventAIdempotent
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.
Inputs: event_id (required), guild_id (required), name, image, +6 more.
discord_edit_webhookAIdempotent
Update a webhook's name, avatar, or the channel it posts to. Only provided fields change. Requires the Manage Webhooks permission. Returns a confirmation.
Inputs: webhook_id (required), name, avatar, channel_id.
discord_edit_webhook_messageAIdempotent
Edit a message previously sent through a webhook, using the webhook's ID and token. Replaces the provided fields. No bot permission is needed: the token authorizes the edit. For a message the bot sent itself, use discord_edit_message or discord_edit_embed. Returns a confirmation.
Inputs: message_id (required), webhook_id (required), webhook_token (required), embeds, +1 more.
discord_fetch_pinned_messagesARead-only
List a channel's pinned messages, most recently pinned first. Returns { messages: [...], hasMore, nextBefore } with id, author, content, timestamp, pinnedAt, and the text of any embeds. Discord serves at most 50 pins per call, so when hasMore is true pass nextBefore back as before to fetch the next page. Requires the View Channel and Read Message History permissions; without Read Message History Discord returns an empty list, not an error. Use discord_pin_message to change which messages are pinned, or discord_read_messages to read the whole channel.
Inputs: channel_id (required), limit, before. Returns: hasMore, guild_id, messages, nextBefore
discord_fetch_webhook_messageARead-only
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.
Inputs: message_id (required), webhook_id (required), webhook_token (required). Returns: id, embeds, content, timestamp
discord_find_channel_by_nameARead-only
Find channels whose name contains a substring (case-insensitive). Returns { matches: [...] } with the id, name and type of every match, active threads included. The list is empty when nothing matches. Useful for resolving a channel_id when you only know the channel's name. Use discord_list_channels to see every channel grouped by category.
Inputs: name (required), guild_id (required). Returns: matches
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.
Inputs: source_channel_id (required), target_channel_id (required).
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.
Inputs: channel_id (required), message_id (required), target_channel_id (required).
discord_get_audit_logARead-only
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.
Inputs: guild_id (required), limit, action_type. Returns: entries
discord_get_channel_permissionsARead-only
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.
Inputs: channel_id (required). Returns: overwrites
discord_get_event_subscribersARead-only
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 after to fetch the next page. Read-only.
Inputs: event_id (required), guild_id (required), after, limit. Returns: nextCursor, subscribers
discord_get_forum_channelsARead-only
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.
Inputs: guild_id (required). Returns: channels
discord_get_forum_postARead-only
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.
Inputs: thread_id (required), limit. Returns: id, name, locked, archived, +4 more
discord_get_forum_tagsARead-only
List the tags available on a forum channel (id, name, emoji, moderated flag). Use these IDs with discord_create_forum_post or discord_update_forum_post; manage the tag set with discord_set_forum_tags. The emoji field holds a unicode emoji, or null when the tag has none or uses a custom server emoji. Fails when the channel is not a forum.
Inputs: forum_channel_id (required). Returns: tags
discord_get_guild_infoARead-only
Get details about one server: name, description, member/channel/role counts, boost tier, owner, and creation date. The owner field is a user ID. roleCount includes the @everyone role. Use discord_get_server_stats for a finer breakdown (humans vs bots, channel types).
Inputs: guild_id (required). Returns: id, name, owner, createdAt, +6 more
discord_get_inviteARead-only
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.
Inputs: invite_code (required). Returns: url, code, uses, inviter, +9 more
discord_get_member_infoARead-only
Get full details for one server member: roles, effective permissions, account/join dates, bot flag, and current timeout status. Permissions come from the member's roles, server-wide: channel overwrites are not applied. The owner and Administrators list every flag. To find a member by name use discord_search_members; to page through members use discord_list_members.
Inputs: user_id (required), guild_id (required). Returns: id, bot, roles, joinedAt, +5 more
discord_get_membership_screeningARead-only
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.
Inputs: guild_id (required). Returns: version, description, form_fields
discord_get_message_attachmentsARead-only
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.
Inputs: channel_id (required), message_id (required). Returns: attachments
discord_get_reactionsARead-only
List the users who reacted to a message with a specific emoji. Returns { reactions: [...] } with id, username, bot flag. At most 100 users come back, with no cursor for the rest. Super reactions are not listed. Fails when no one reacted with that emoji.
Inputs: emoji (required), channel_id (required), message_id (required), limit. Returns: reactions
discord_get_role_membersARead-only
List members who currently hold a specific role, scanning up to 20,000 members. Returns { members: [...], truncated }; check truncated on very large servers. Read-only. Use discord_list_roles to discover role IDs first.
Inputs: role_id (required), guild_id (required). Returns: note, members, truncated
discord_get_scheduled_eventARead-only
Get full details for one scheduled event: name, description, status, type, channel/location, start/end times, creator, and interested-user count. Status is SCHEDULED, ACTIVE, COMPLETED or CANCELED, and entity_type is VOICE, STAGE_INSTANCE or EXTERNAL. Find the event_id with discord_list_scheduled_events; list the interested users with discord_get_event_subscribers.
Inputs: event_id (required), guild_id (required). Returns: id, name, image, status, +8 more
discord_get_server_statsARead-only
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. Note: bots are counted from the member cache only, so botsInCache is a lower bound and humans (total minus cached bots) an upper bound. The roles count excludes @everyone. In channels, total covers every channel type, while text, voice and categories count only their own. For the server's owner and description, use discord_get_guild_info.
Inputs: guild_id (required). Returns: name, roles, humans, channels, +5 more
discord_kick_memberADestructive
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.
Inputs: user_id (required), guild_id (required), reason.
discord_list_bansARead-only
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 after to fetch the next page. Requires the Ban Members permission. Read-only.
Inputs: guild_id (required), after, limit. Returns: bans, nextCursor
discord_list_channel_invitesARead-only
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.
Inputs: channel_id (required). Returns: invites
discord_list_channelsARead-only
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.
Inputs: guild_id (required). Returns: object
discord_list_channel_threadsARead-only
List the threads in a text or announcement channel. Returns { threads: [...], hasMore, nextBefore }. The first call includes active threads plus the first page of archived ones; while hasMore is true pass nextBefore back as before. hasMore means that page came back full, so the last call can return nothing. Requires the View Channel and Read Message History permissions. Read-only. Use discord_list_forum_threads for a forum's posts.
Inputs: channel_id (required), type, limit, before. Returns: hasMore, threads, nextBefore
discord_list_forum_threadsARead-only
List posts in a forum channel. Returns { threads: [...], hasMore, nextBefore }. The first call (no before) includes all active posts plus the first page of archived posts; archived posts are paginated, so if hasMore is true pass nextBefore back as before to fetch older archived posts. Use discord_get_forum_post to read one post's messages. For threads in a text or announcement channel, use discord_list_channel_threads.
Inputs: forum_channel_id (required), limit, before. Returns: hasMore, threads, nextBefore
discord_list_guildsARead-only
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.
Inputs: no named parameters. Returns: guilds
discord_list_invitesARead-only
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.
Inputs: guild_id (required). Returns: invites
discord_list_membersARead-only
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 after to fetch the next page. Use discord_search_members to find specific members by name, or discord_get_member_info for one member's full details. Read-only.
Inputs: guild_id (required), after, limit. Returns: members, nextCursor
discord_list_rolesARead-only
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.
Inputs: guild_id (required). Returns: roles
discord_list_scheduled_eventsARead-only
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.
Inputs: guild_id (required). Returns: events
discord_list_webhooksARead-only
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. SECURITY: a returned token lets anyone post as that webhook; treat it as a secret. Pass the id and token to discord_send_webhook_message, or create a webhook with discord_create_webhook.
Inputs: guild_id, channel_id. Returns: webhooks
discord_lock_channel_permissionsAIdempotent
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.
Inputs: channel_id (required).
discord_move_channelAIdempotent
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.
Inputs: channel_id (required), category_id.
discord_pin_messageAIdempotent
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 250 pins. Idempotent: pinning an already-pinned message (or unpinning an unpinned one) has no additional effect.
Inputs: pin (required), channel_id (required), message_id (required).
discord_prune_membersADestructive
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.
Inputs: days (required), guild_id (required), roles, reason, +1 more.
discord_read_dmsARead-only
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.
Inputs: user_id (required), limit. Returns: messages
discord_read_messagesARead-only
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; without Read Message History Discord returns an empty list, not an error. Returns { messages: [...] } with id, author, content, timestamp, attachment count, pinned flag, and the text of any embeds. Use discord_search_messages or discord_search_guild_messages to filter by keyword, or discord_fetch_pinned_messages for pinned messages only.
Inputs: channel_id (required), after, limit, since, +2 more. Returns: guild_id, messages
discord_remove_reactionsADestructiveIdempotent
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.
Inputs: channel_id (required), message_id (required), emoji, user_id.
discord_remove_roleAIdempotent
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.
Inputs: role_id (required), user_id (required), guild_id (required), reason.
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.
Inputs: content (required), user_id (required), message_id (required).
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.
Inputs: content (required), channel_id (required), message_id (required).
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.
Inputs: content (required), thread_id (required).
discord_reset_channel_permissionsADestructiveIdempotent
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.
Inputs: channel_id (required), reason.
discord_search_guild_messagesARead-only
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. While Discord is still building the server's search index, the call fails and says how many seconds to wait. Use discord_search_messages for a substring scan of one channel's last 100 messages. To read the messages around a hit, use discord_read_messages with around.
Inputs: query (required), guild_id (required), limit, author_id, +1 more. Returns: matches
discord_search_membersARead-only
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.
Inputs: query (required), guild_id (required), limit. Returns: members
discord_search_messagesARead-only
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, and the text of any embeds. Matching checks message content only, so a word that appears only in an embed is not found. Use discord_read_messages to fetch recent messages without filtering. To search full history, in one channel or the whole server, use discord_search_guild_messages.
Inputs: keyword (required), channel_id (required), limit. Returns: matches
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.
Inputs: content (required), user_id (required).
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.
Inputs: user_id (required), url, color, title, +8 more.
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.
Inputs: channel_id (required), url, color, title, +7 more.
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.
Inputs: content (required), channel_id (required).
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.
Inputs: embeds (required), channel_id (required), content.
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.
Inputs: webhook_id (required), webhook_token (required), embeds, content, +2 more.
discord_set_channel_positionAIdempotent
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.
Inputs: position (required), channel_id (required).
discord_set_forum_tagsADestructiveIdempotent
Replace the full set of available tags on a forum channel with the provided list. Include every tag you want to keep: a listed tag whose name matches an existing tag (case-insensitive) keeps its ID and stays on posts, while a tag left out is deleted and disappears from every post. Requires the Manage Channels permission. Returns a confirmation.
Inputs: tags (required), forum_channel_id (required).
discord_set_member_permissionAIdempotent
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.
Inputs: user_id (required), channel_id (required), deny, allow, +1 more.
discord_set_nicknameAIdempotent
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.
Inputs: user_id (required), guild_id (required), nickname (required), reason.
discord_set_role_iconAIdempotent
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.
Inputs: role_id (required), guild_id (required), icon, unicode_emoji.
discord_set_role_permissionAIdempotent
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.
Inputs: role_id (required), channel_id (required), deny, allow, +1 more.
discord_set_role_positionAIdempotent
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.
Inputs: role_id (required), guild_id (required), position (required).
discord_timeout_memberAIdempotent
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.
Inputs: user_id (required), guild_id (required), duration_minutes (required), reason.
discord_unban_memberAIdempotent
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.
Inputs: user_id (required), guild_id (required), reason.
discord_update_forum_postAIdempotent
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. To change which tags the forum offers, use discord_set_forum_tags; this tool picks among the forum's existing tags for one post.
Inputs: thread_id (required), title, locked, archived, +1 more.
discord_update_membership_screeningAIdempotent
Update the server's membership screening form: set the welcome description and the rules new members must agree to. Only provided fields change. Passing form_fields replaces every existing field with TERMS rule blocks, which deletes any question field. Read the form first with discord_get_membership_screening. Requires the Community feature and the Manage Server permission. Returns the updated form.
Inputs: guild_id (required), description, form_fields.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 100 tools
Tools generally target distinct Discord contexts and resources, and descriptions consistently point to the right alternative for channel vs DM vs webhook vs forum vs embed operations. However, with 100 tools there are many closely related variants such as send_message/send_embed/send_multiple_embeds and edit_message/edit_embed/edit_dm_embed, so occasional misselection remains plausible.
Every tool uses the discord_ prefix plus snake_case verb_noun naming, with predictable list/get/create/update/delete/edit/set patterns. Minor verb choices like fetch vs get and reply_to_forum are still readable and consistent.
100 tools is far beyond a well-scoped agent surface, and even for broad Discord administration the set splits many operations into near-duplicate context-specific variants. This creates a large selection burden and makes it hard for each tool to earn its place.
Coverage is extensive across guilds, channels, messages, roles, permissions, invites, webhooks, scheduled events, forums, DMs, and moderation. Minor gaps remain, notably full lifecycle management for ordinary text-channel threads and areas like emojis, stickers, or voice operations, but core workflows are covered.
Maintenance
Related MCP Connectors
- Discortics - Discord BotDeprecatedcom.discortics
Set up and manage your Discord server from MCP: channels, roles, verification, tickets and security.
One MCP server for all your MCP servers: code mode, per-tool permissions, approvals and audit.
Build your own tools from chat: design, test and host them on a shareable MCP server URL.
An MCP server for deep research or task groups
Related MCP Servers
- AlicenseCqualityBmaintenanceA Discord Model Context Protocol server that enables AI assistants to interact with Discord, providing functionality for sending messages, managing channels, handling forum posts, and working with reactions.46860 npm111MIT
- AlicenseNot gradedqualityDmaintenanceThe most complete open-source MCP server for Discord — 80+ tools, dual-mode: integrated (plugin) or standalone70 npm16MIT
- AlicenseAqualityDmaintenanceAn MCP server providing 26 tools for Discord API interactions, enabling message management, moderation, channel operations, and server inspection through Claude Code, Paperclip agents, or other MCP-compatible clients.26MIT
- AlicenseAqualityDmaintenanceMCP server for interacting with Discord via REST API, enabling guild, channel, and message operations using a bot token.7MIT