discord-mcp (spyd3r83/discord-mcp) is an MCP server listed on the M8ven Trust Index. It scores 58 out of 100, grade D. It declares 56 tools. No publisher has claimed this listing.

D
Caution
58/100

discord-mcp

A full-featured Discord MCP (Model Context Protocol) server — send messages, manage channels, guilds, roles, members, threads, webhooks and more.

Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.

How we verified

Code Verified⚡ Live Monitored: not connected

Verified is a snapshot. Live keeps it current, and builds your track record.

⚡ Connect GitHub → continuous verification on every pushwhy connect →

Who stands behind it

spyd3r83

Source: github_code

Is this your MCP?

Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →

Install from

The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.

// key findings
🚨
Known vulnerabilities in dependencies: 2 critical, 3 high
Affects packages this MCP installs at runtime. Upgrade or remove the affected dependency.
🔐
You'll be asked for 1 credential: DISCORD_BOT_TOKEN
These are read from process.env at runtime. Make sure you trust where they’ll be sent.
// tools this server exposes56 tools

These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.

get_audit_log

Fetch audit log entries from a Discord guild. Shows moderator actions like bans, kicks, role changes, channel edits, etc. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds

list_channels

List all channels (text, voice, forum, category, etc.) in a Discord guild (server). Returns each channel's Discord snowflake ID (a 17-19 digit integer string like "1471337835444310187"), display name, and channel type number. IMPORTANT — two different kinds of "channel ID" exist in this system:

get_channel

Fetch metadata for a single Discord channel by its Discord snowflake ID. Returns the channel's snowflake id, type, and (for guild channels) name and guild_id. IMPORTANT — channel_id here is a Discord snowflake (17-19 digit integer string like "1471337835444310187"), NOT a non-Discord channel UUID

create_channel

Create a new channel in a Discord guild (server). Required parameters: • guild_id — Discord guild snowflake ID (17-19 digits, e.g. "1396724253621223584"). Call discord-ext_list_guilds to find it. • name — channel name (lowercase, hyphens for spaces) • type — Discord ChannelType integer: 0=tex

edit_channel

Edit properties of an existing Discord channel (name, topic, slowmode, NSFW flag). Required parameter: • channel_id — Discord channel snowflake ID (17-19 digits, e.g. "1471337835444310187"). NOT a non-Discord channel UUID. Call discord-ext_list_channels to look up a channel snowflake by name.

delete_channel

Permanently delete a Discord channel by its snowflake ID. This action is irreversible. Required parameter: • channel_id — Discord channel snowflake ID (17-19 digits, e.g. "1471337835444310187"). NOT a non-Discord channel UUID. Use discord-ext_list_channels to look up the snowflake by channel

set_channel_permissions

Set a permission overwrite for a role or member on a specific Discord channel. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digits). NOT a non-Discord channel UUID. • target_id — snowflake ID of the role or member to set permissions for • target_type — "role" or "me

send_dm

Send a direct message (DM) to a Discord user by their user snowflake ID. Required parameters: • user_id — Discord user snowflake ID (17-19 digit integer string, e.g. "123456789012345678"). This is the user's Discord account ID, NOT a channel ID or non-Discord UUID. If you only know a user

get_user

Fetch public profile information for a Discord user by their snowflake ID. Required parameter: • user_id — Discord user snowflake ID (17-19 digit integer string, e.g. "123456789012345678"). NOT a non-Discord agent/user ID — this is a Discord account snowflake. Returns: { id, username, discri

list_forum_posts

List all active (non-archived) posts in a Discord forum channel. Required parameter: • channel_id — Discord snowflake ID of the forum channel (17-19 digit integer string). Must be a ChannelType 15 (GuildForum) channel. NOT a non-Discord channel UUID. Call discord-ext_list_channels with ty

create_forum_post

Create a new post (thread) inside a Discord forum channel. Required parameters: • channel_id — Discord snowflake ID of the forum channel (17-19 digit integer, ChannelType 15). NOT a non-Discord channel UUID. Use discord-ext_list_channels with type=15 to find it. • name — title of the forum

close_forum_post

Archive (close) a forum post by its thread snowflake ID. Required parameter: • thread_id — Discord snowflake ID of the forum thread/post to archive (17-19 digit integer). Call discord-ext_list_forum_posts to find the thread snowflake ID by name. Archived posts are hidden from the active list

get_guild

Fetch metadata about a Discord guild (server) by its snowflake ID. Returns the guild's snowflake id, name, and approximate member count. Required parameter: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). Call discord-ext_list_guilds first if

list_guilds

List all Discord guilds (servers) the bot is currently a member of. Returns each guild's snowflake ID (17-19 digit integer string) and name. This is the starting point for all guild-scoped operations — call this first to get the guild_id needed by tools like discord-ext_list_channels, discord-ext_g

get_guild_member_count

Get the total member count for a Discord guild (server). Required parameter: • guild_id — Discord guild snowflake ID (17-19 digits, e.g. "1396724253621223584"). Call discord-ext_list_guilds to find it. Returns: { "memberCount": <number> }

get_member

Get detailed information about a specific member of a Discord guild (server). Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. • user_id — D

list_members

List members of a Discord guild (server). Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. Optional: • limit — max members to return (1–100

search_members

Search for members in a Discord guild by username or nickname. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. • query — search string to m

edit_member

Edit a member's properties in a Discord guild (nickname, mute, deaf). Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. • user_id — Discord u

send_message

Send a plain text message to a Discord channel. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1397109398337224736"). This is NOT a non-Discord channel UUID (like "bcdf5931-..."). These are completely different IDs. If you only know the

edit_message

Edit the content of an existing Discord message (only messages sent by the bot can be edited). Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit number, e.g. "1397109398337224736"). NOT a non-Discord channel UUID. Use discord-ext_list_channels to find a channel sno

delete_message

Delete a Discord message from a channel. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit number, e.g. "1397109398337224736"). NOT a non-Discord channel UUID. • message_id — Discord message snowflake ID to delete Deletion is permanent. The bot must have Manage

get_message

Fetch a single Discord message by its snowflake ID. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit number, e.g. "1397109398337224736"). NOT a non-Discord channel UUID. Use discord-ext_list_channels to look up channel snowflakes by name. • message_id — Discord

list_messages

Fetch recent messages from a Discord channel. Required parameter: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1397109398337224736"). This is a Discord snowflake, NOT a non-Discord channel UUID (like "bcdf5931-..."). If you received a message from the use

pin_message

Pin a Discord message in a channel so it appears in the channel's pinned messages list. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digits, e.g. "1397109398337224736"). NOT a non-Discord channel UUID. • message_id — Discord message snowflake ID to pin The bot must h

unpin_message

Unpin a previously pinned Discord message from a channel. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digits, e.g. "1397109398337224736"). NOT a non-Discord channel UUID. • message_id — Discord message snowflake ID to unpin The bot must have Manage Messages permissi

send_embed

Send a rich embed message (with title, description, fields, color, image, etc.) to a Discord channel. Required parameter: • channel_id — Discord channel snowflake ID (17-19 digit number, e.g. "1397109398337224736"). NOT a non-Discord channel UUID. Use discord-ext_list_channels to find the sno

ban_member

Ban a user from a Discord guild (server). Removes the user and prevents them from rejoining. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it.

unban_member

Unban a previously banned user from a Discord guild (server). Allows them to rejoin. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. • user

kick_member

Kick a user from a Discord guild (server). They can rejoin with an invite. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. • user_id — Disc

timeout_member

Timeout (mute) a user in a Discord guild for a specified duration. They cannot send messages or join voice channels during the timeout. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-e

remove_timeout

Remove an active timeout from a Discord guild member, allowing them to send messages and join voice again. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you d

list_bans

List banned users in a Discord guild (server). Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. Optional: • limit — max bans to return (1–1

add_reaction

Add an emoji reaction to a Discord message. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1396725483621223584"). NOT a non-Discord UUID. Call discord-ext_list_channels first if you don't know it. • message_id — Discord message snowflake

remove_reaction

Remove the bot's own emoji reaction from a Discord message. Only removes the bot's reaction, not other users'. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1396725483621223584"). NOT a non-Discord UUID. Call discord-ext_list_channels firs

remove_user_reaction

Remove a specific user's emoji reaction from a Discord message. Requires the Manage Messages permission. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1396725483621223584"). NOT a non-Discord UUID. Call discord-ext_list_channels first if y

list_reactions

List users who reacted to a Discord message with a specific emoji. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1396725483621223584"). NOT a non-Discord UUID. Call discord-ext_list_channels first if you don't know it. • message_id — Dis

clear_reactions

Remove all emoji reactions from a Discord message. Requires the Manage Messages permission. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1396725483621223584"). NOT a non-Discord UUID. Call discord-ext_list_channels first if you don't know

list_roles

List all roles in a Discord guild (server). Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. Returns: [{ id, name, color }] Example: discord

get_role

Get detailed information about a specific Discord role. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. • role_id — Discord role snowflake

create_role

Create a new role in a Discord guild (server). Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. • name — name for the new role (e.g. "Modera

edit_role

Edit an existing Discord role's properties. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. • role_id — Discord role snowflake ID (17-19 di

delete_role

Delete a role from a Discord guild (server). Members who only had this role will lose it. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. •

assign_role

Assign a role to a Discord guild member. The member gains all permissions and properties of that role. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't

remove_role

Remove a role from a Discord guild member. The member loses all permissions and properties of that role. Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don

create_thread

Create a thread attached to an existing Discord message. The thread starts in the same channel as the message. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1396725483621223584"). NOT a non-Discord UUID. Call discord-ext_list_channels firs

create_standalone_thread

Create a standalone thread in a Discord channel without attaching it to a specific message. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1396725483621223584"). NOT a non-Discord UUID. Call discord-ext_list_channels first if you don't know

list_threads

List all active threads in a Discord guild (server). Required parameters: • guild_id — Discord guild snowflake ID (17-19 digit integer string, e.g. "1396724253621223584"). NOT a non-Discord UUID. Call discord-ext_list_guilds first if you don't know it. Returns: [{ id, name, archived }] Exam

archive_thread

Archive a Discord thread. Archived threads are hidden but can be unarchived later. Required parameters: • thread_id — Discord thread snowflake ID (17-19 digit integer string, e.g. "1396725500621223584"). NOT a non-Discord UUID. Call discord-ext_list_threads first if you don't know it. Return

unarchive_thread

Unarchive a previously archived Discord thread, making it active again. Required parameters: • thread_id — Discord thread snowflake ID (17-19 digit integer string, e.g. "1396725500621223584"). NOT a non-Discord UUID. Call discord-ext_list_threads first if you don't know it. Returns: "Thread

add_thread_member

Add a member to a Discord thread. The user will be able to see and send messages in the thread. Required parameters: • thread_id — Discord thread snowflake ID (17-19 digit integer string, e.g. "1396725500621223584"). NOT a non-Discord UUID. Call discord-ext_list_threads first if you don't kno

remove_thread_member

Remove a member from a Discord thread. The user will no longer see the thread. Required parameters: • thread_id — Discord thread snowflake ID (17-19 digit integer string, e.g. "1396725500621223584"). NOT a non-Discord UUID. Call discord-ext_list_threads first if you don't know it. • user_id

list_webhooks

List all webhooks in a Discord channel. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1396725483621223584"). NOT a non-Discord UUID. Call discord-ext_list_channels first if you don't know it. Returns: [{ id, name, url }] Example: discord

create_webhook

Create a new webhook in a Discord channel. Webhooks can send messages with a custom name and avatar. Required parameters: • channel_id — Discord channel snowflake ID (17-19 digit integer string, e.g. "1396725483621223584"). NOT a non-Discord UUID. Call discord-ext_list_channels first if you d

delete_webhook

Delete a Discord webhook. Required parameters: • webhook_id — Discord webhook snowflake ID (17-19 digit integer string, e.g. "1396726000621223584"). NOT a non-Discord UUID. Call discord-ext_list_webhooks first if you don't know it. Returns: "Webhook deleted" Example: discord-ext_delete_webh

send_webhook_message

Send a message through a Discord webhook with optional custom username, avatar, and embeds. Required parameters: • webhook_id — Discord webhook snowflake ID (17-19 digit integer string, e.g. "1396726000621223584"). NOT a non-Discord UUID. Call discord-ext_list_webhooks first if you don't know

// known CVEs in dependencies2 critical3 high

Disclosed vulnerabilities in this server's declared npm dependencies (via OSV). Whether each is reachable depends on the installed versions.

criticalvitest@3.0.0GHSA-5xrq-8626-4rwp

When Vitest UI server is listening, arbitrary file can be read and executed

criticalvitest@3.0.0GHSA-9crc-q9x8-hgqq

Vitest allows Remote Code Execution when accessing a malicious website while Vitest API server is listening

high@modelcontextprotocol/sdk@1.12.0GHSA-345p-7cg4-v4c7

@modelcontextprotocol/sdk has cross-client data leak via shared server/transport instance reuse

high@modelcontextprotocol/sdk@1.12.0GHSA-8r9q-7v3j-jr4g

Anthropic's MCP TypeScript SDK has a ReDoS vulnerability

high@modelcontextprotocol/sdk@1.12.0GHSA-w48q-cv73-mx4w

Model Context Protocol (MCP) TypeScript SDK does not enable DNS rebinding protection by default

Depend on this server? Get alerted when its CVEs change.Watch this server free →
// environment variables
To run this server yourself, you supply these values. They go in your own MCP client configuration and stay on your machine. The secret label means the value is sensitive, not that the server mishandles it.
🔐 secretDISCORD_BOT_TOKENBot token auth — just set
configLOG_LEVEL❌ info Log level: debug, info, warn, error
Deployment configuration, supplied by whoever hosts the server. Users are not asked for these.
deployPORT
// quality suggestions

Tool annotations

No tools have read-only/destructive annotations

Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.

All four hints declared on every tool

56/56 tools missing one or more hints — get_audit_log (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); list_channels (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); get_channel (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +53 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.

For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.

Tool inputs are validated

Only 1/56 tool handlers declare input schemas (2%)

Declare an inputSchema with zod/joi/yup on every tool definition.

License file

No license file

Add a LICENSE file (MIT, Apache-2.0, etc.).

Production dependencies are patched

0 critical, 3 high severity in production deps — @modelcontextprotocol/sdk@1.12.0 (high), @modelcontextprotocol/sdk@1.12.0 (high)

Run npm audit fix, or upgrade the affected packages to a non-vulnerable version.

Dev dependencies

2 critical/high in dev-only deps (does not ship to users)

Upgrade dev dependencies when convenient.

Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.

// full audit trail
The findings above are the summary. The full trail, every check we ran, each deduction, the network hosts observed and the dependency advisories, goes to verified publishers, along with an alert whenever a new one lands. Verified publishers can also review each finding and dispute it in one click. Publisher corrections have sharpened several of our checks this month, because the maintainer knows the codebase better than any scanner.
// improvement guidance — verified publishers only
We have 6 concrete improvements we can share with the publisher of this MCP. Each comes with specific guidance to raise the trust score.
// embed badge in your README
[![M8ven Verified](https://m8ven.ai/badge/mcp/spyd3r83/discord-mcp?variant=verified)](https://m8ven.ai/mcp/spyd3r83/discord-mcp)
Shows verification status without the grade. Want the grade badge instead? Remove ?variant=verified from the URL.
commit: 93c437cecea869f03d2b4990dc842c2f27e10627
code hash: e38c63a27e0513ce2712f80adf106d83436818d83d1396014dd114ef516c202d
view raw JSON →
Check MCPs from inside your assistant
Tool Check · MCP

Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.

https://m8ven.ai/api/mcp/tool-check
check_toolsearch_toolscompare_toolsrecommend_alternativescheck_publisherreport_concern
How to add it →Free · no account needed · works in any MCP client