Skip to main content
Glama

npm npm downloads License discord-mcp MCP server

Install in VS Code Install in VS Code Insiders Install in Cursor

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

  1. 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.

  2. Invite it to your server. Replace YOUR_CLIENT_ID with the Application ID from General Information, then open the link:

    https://discord.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&scope=bot&permissions=2270827458424055

    It requests the permissions the tools use. Remove the ones you do not need in the authorization screen.

  3. 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

DISCORD_MCP_TOOLSETS

Tools

Context

Everything (default)

unset

100

~32k tokens

Chat assistant

discovery,messages

25

~9k tokens

Community manager

discovery,messages,forums,scheduled_events

42

~15k tokens

Moderator

discovery,members,moderation,roles,permissions

31

~9k tokens

Audit and stats

discovery,stats,moderation

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_members and discord_delete_channel run as a dry run by default and report what would happen. Pass dry_run: false to apply.

  • Stay in your servers. DISCORD_ALLOWED_GUILDS restricts 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 declares destructiveHint, 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 declare readOnlyHint: true. A call to any other tool fails as an unknown tool. Two reads stay sensitive. discord_list_webhooks returns webhook tokens, and a token lets anyone post through its webhook without this server. discord_read_dms reads the bot's direct messages with a user. To hide both, leave webhooks and dm out of DISCORD_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.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

claude mcp add discord -e DISCORD_TOKEN=YOUR_BOT_TOKEN -- npx -y @pasympa/discord-mcp

Use 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-mcp

Open 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-mcp

The 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:latest

The 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/mcp

  • Server Transport: HTTP Streamable

  • Authentication: Header Auth, with a credential whose Name is Authorization and Value is Bearer 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. Use 0.0.0.0 only inside a container, with the port published on 127.0.0.1.

  • Token. Use at least 32 characters: openssl rand -hex 32 gives 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 Host of localhost, 127.0.0.1, [::1] or a name in DISCORD_MCP_HTTP_ALLOWED_HOSTS. Any request with an Origin header 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 /mcp stands alone, and GET and DELETE answer 405. 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

DISCORD_TOKEN

none

Required. Bot token.

DISCORD_MCP_TOOLSETS

all

Comma-separated toolsets to expose (see Expose only what you need). Unset, empty or all exposes every tool.

DISCORD_MCP_READ_ONLY

false

Set to true to expose only the tools annotated readOnlyHint: true. Accepts true/false, 1/0, yes/no or on/off; any other value stops the server at startup.

DISCORD_ALLOWED_GUILDS

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.

DISCORD_MESSAGE_CONTENT

true

Set to false to stop requesting the Message Content privileged intent at connect time.

DISCORD_GUILD_MEMBERS

true

Set to false to stop requesting the Server Members privileged intent at connect time.

DISCORD_MCP_TRANSPORT

stdio

stdio, or http to serve Streamable HTTP (see Remote clients over HTTP). Any other value stops the server at startup.

DISCORD_MCP_HTTP_TOKEN

none

Required in http mode. Bearer token every request must carry: at least 32 characters from the RFC 6750 b64token alphabet (letters, digits, -._~+/, trailing =), different from DISCORD_TOKEN.

DISCORD_MCP_HTTP_HOST

127.0.0.1

Address to listen on in http mode.

DISCORD_MCP_HTTP_PORT

3000

Port to listen on in http mode.

DISCORD_MCP_HTTP_ALLOWED_HOSTS

none

Comma-separated hostnames, without port, accepted in the Host header besides localhost, 127.0.0.1 and [::1], such as the public name a reverse proxy forwards.

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

discord_list_guilds

List all servers the bot is connected to

discord_get_guild_info

Get detailed guild info (name, members, channels, roles, boosts)

discord_list_channels

List all channels in a guild grouped by category

discord_find_channel_by_name

Find a channel by name (partial match)

Tool

Description

discord_read_messages

Read messages, paging back through history

discord_send_message

Send a plain text message

discord_reply_message

Reply to a specific message

discord_edit_message

Edit a message sent by the bot

discord_delete_message

Delete a specific message

discord_add_reaction

Add a reaction emoji to a message

discord_remove_reactions

Remove reactions (all, by emoji, or by user)

discord_get_reactions

List users who reacted with a specific emoji

discord_create_thread

Create a thread from a message or standalone

discord_list_channel_threads

List a text channel's threads, paged

discord_bulk_delete_messages

Delete multiple messages at once (2-100)

discord_send_embed

Send a rich embed with all options

discord_edit_embed

Edit an embed previously sent by the bot

discord_send_multiple_embeds

Send up to 10 embeds in a single message

discord_pin_message

Pin or unpin a message

discord_get_message_attachments

List a message's attachments with download urls

discord_fetch_pinned_messages

List a channel's pinned messages, paged

discord_search_messages

Search messages by keyword (last 100)

discord_search_guild_messages

Search across every channel using Discord's search index

discord_crosspost_message

Publish a message to announcement channel followers

discord_forward_message

Forward a message to another channel

Tool

Description

discord_create_channel

Create a text, voice channel or category

discord_delete_channel

Delete a channel

discord_edit_channel

Edit name, topic, slowmode, NSFW flag

discord_move_channel

Move a channel into/out of a category

discord_clone_channel

Clone a channel with its permissions

discord_set_channel_position

Set display position within a category

discord_follow_announcement_channel

Follow an announcement channel

discord_lock_channel_permissions

Sync permissions with parent category

Tool

Description

discord_get_channel_permissions

List all permission overwrites on a channel

discord_set_role_permission

Allow/deny permissions for a role on a channel

discord_set_member_permission

Allow/deny permissions for a member on a channel

discord_reset_channel_permissions

Remove all overwrites (reset to inherited)

discord_copy_permissions

Copy overwrites from one channel to another

discord_audit_permissions

Full permission audit for all channels

Tool

Description

discord_list_members

List guild members with their roles

discord_get_member_info

Detailed member info (roles, permissions, join date)

discord_search_members

Search members by username or nickname

discord_set_nickname

Set or clear a member's nickname

discord_kick_member

Kick a member

discord_ban_member

Ban a member (optionally delete recent messages)

discord_unban_member

Unban a user

discord_bulk_ban

Ban multiple users at once (raid mitigation)

discord_list_bans

List all banned users

discord_timeout_member

Timeout a member (0 to remove)

discord_prune_members

Remove inactive members (with dry run)

Tool

Description

discord_list_roles

List all roles with permissions and member count

discord_create_role

Create a new role

discord_edit_role

Edit a role (name, color, permissions, hoist, mentionable)

discord_delete_role

Delete a role

discord_add_role

Assign a role to a member

discord_remove_role

Remove a role from a member

discord_get_role_members

List all members with a specific role

discord_set_role_position

Change a role's position in the hierarchy

discord_set_role_icon

Set a custom icon or unicode emoji on a role

Tool

Description

discord_get_forum_channels

List all forum channels in a guild

discord_create_forum_channel

Create a new forum channel

discord_create_forum_post

Create a post/thread in a forum

discord_get_forum_post

Get a post's details and messages

discord_list_forum_threads

List threads (active + archived)

discord_reply_to_forum

Reply to a forum post

discord_delete_forum_post

Delete a forum thread

discord_get_forum_tags

Get available tags

discord_set_forum_tags

Set/update tags on a forum

discord_update_forum_post

Update title, archived, locked, tags

Tool

Description

discord_create_webhook

Create a webhook on a channel

discord_send_webhook_message

Send via webhook (custom username/avatar, embeds)

discord_edit_webhook

Edit a webhook's name, avatar, or channel

discord_delete_webhook

Delete a webhook

discord_list_webhooks

List webhooks for a channel or guild

discord_edit_webhook_message

Edit a message sent by a webhook

discord_delete_webhook_message

Delete a message sent by a webhook

discord_fetch_webhook_message

Fetch a specific webhook message

Tool

Description

discord_list_scheduled_events

List all scheduled events in a guild

discord_get_scheduled_event

Get detailed info about a scheduled event

discord_create_scheduled_event

Create a voice, stage, or external event

discord_edit_scheduled_event

Edit an existing scheduled event

discord_delete_scheduled_event

Delete a scheduled event

discord_get_event_subscribers

Get users who marked "Interested"

discord_create_event_invite

Create an invite linked to an event

Tool

Description

discord_send_dm

Send a direct message to a user by their user ID

discord_send_dm_embed

Send an embed in a DM to a user

discord_read_dms

Read message history from a DM conversation

discord_reply_dm

Reply to a specific DM message

discord_edit_dm

Edit a previously sent DM (text)

discord_edit_dm_embed

Edit a previously sent DM embed

discord_delete_dm

Delete a DM message

Tool

Description

discord_list_invites

List all active invites in a guild

discord_list_channel_invites

List invites for a specific channel

discord_get_invite

Get details about an invite by its code

discord_create_invite

Create an invite link for a channel

discord_delete_invite

Revoke an invite

Tool

Description

discord_get_audit_log

Fetch the guild audit log

discord_get_membership_screening

Get the membership screening form

discord_update_membership_screening

Update screening rules for new members

discord_get_server_stats

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 set DISCORD_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 Access or Missing Permissions. The bot cannot see the channel, or the target role or member sits above the bot's highest role. Check overwrites with discord_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 tools
discord_add_reactionA
Idempotent

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_roleA
Idempotent

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_permissionsA
Read-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_memberA
DestructiveIdempotent

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_banA
Destructive

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_messagesA
Destructive

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_permissionsA
DestructiveIdempotent

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_messageA
Idempotent

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_channelA
Destructive

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_dmA
Destructive

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_postA
Destructive

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_inviteA
Destructive

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_messageA
Destructive

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_roleA
Destructive

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_eventA
Destructive

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_webhookA
Destructive

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_messageA
Destructive

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_channelA
Idempotent

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_dmA
Idempotent

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_embedA
Idempotent

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_embedA
Idempotent

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_messageA
Idempotent

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_roleA
Idempotent

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_eventA
Idempotent

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_webhookA
Idempotent

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_messageA
Idempotent

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_messagesA
Read-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_messageA
Read-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_nameA
Read-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_logA
Read-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_permissionsA
Read-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_subscribersA
Read-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_channelsA
Read-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_postA
Read-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_tagsA
Read-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_infoA
Read-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_inviteA
Read-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_infoA
Read-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_screeningA
Read-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_attachmentsA
Read-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_reactionsA
Read-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_membersA
Read-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_eventA
Read-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_statsA
Read-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_memberA
Destructive

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_bansA
Read-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_invitesA
Read-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_channelsA
Read-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_threadsA
Read-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_threadsA
Read-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_guildsA
Read-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_invitesA
Read-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_membersA
Read-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_rolesA
Read-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_eventsA
Read-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_webhooksA
Read-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_permissionsA
Idempotent

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_channelA
Idempotent

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_messageA
Idempotent

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_membersA
Destructive

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_dmsA
Read-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_messagesA
Read-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_reactionsA
DestructiveIdempotent

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_roleA
Idempotent

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_permissionsA
DestructiveIdempotent

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_messagesA
Read-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_membersA
Read-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_messagesA
Read-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_positionA
Idempotent

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_tagsA
DestructiveIdempotent

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_permissionA
Idempotent

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_nicknameA
Idempotent

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_iconA
Idempotent

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_permissionA
Idempotent

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_positionA
Idempotent

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_memberA
Idempotent

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_memberA
Idempotent

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_postA
Idempotent

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_screeningA
Idempotent

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

    A3.9/5.0

    Scored across 100 tools

    Disambiguation4/5

    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.

    Naming Consistency5/5

    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.

    Tool Count1/5

    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.

    Completeness4/5

    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

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      C
      quality
      B
      maintenance
      A 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.
      46
      860 npm
      111
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      An 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.
      26
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      MCP server for interacting with Discord via REST API, enabling guild, channel, and message operations using a bot token.
      7
      MIT