Guildora
Lets an MCP client read and manage a Discord server through a bot: server info, channels/categories/threads/forum posts, members and roles, message history and server-wide search, sending messages with attachments and embeds, reactions, pins, DMs, plus optional packs for moderation (kick, ban, timeout, bulk delete), channel/role management, thread creation, webhooks, invites, events, voice and custom emoji. Destructive actions default to a dry run unless confirmed, and a read-only mode can hide all mutating tools.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Guildora send a message to #general saying the meeting is at 3pm"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Guildora
A lightweight, pack-based MCP server for Discord. Let Claude (or any MCP client) read and manage
your Discord server through a bot, with one npx command, a small context footprint, and safety
rails for destructive actions.
Guildora is an independent open-source project. It is not affiliated with, endorsed by, or an official product of Discord Inc. "Discord" is a trademark of Discord Inc.
Features
One command, no Java or Docker:
npx -y guildora-mcp. The MCP handshake is answered in about half a second; Discord connects in the background.Small context footprint: tools come in packs. Only
core(20 tools) is on by default; turn on more withGUILDORA_PACKS.Friendly inputs: every channel, role, member, category and emoji argument accepts an ID, a mention (
<#123>,<@&123>,<@123>), a link, or a name (general,#general,Moderators). Ambiguous names return the candidates instead of guessing.Safe by default: destructive tools (delete, kick, ban, bulk delete…) return a dry run unless called with
confirm: true.GUILDORA_READ_ONLY=truehides every tool that changes anything. MCPreadOnlyHint/destructiveHintannotations are set on every tool.Reliable: archived threads work by ID without any "call X first" step; server-wide message search with an honest, bounded fallback; rate limits are queued and long waits are reported; Discord errors become messages that say what to do next.
Made for running a community: Claude can see screenshots and read log files attached to messages (
get_attachment), find tickets and posts still waiting for a staff reply (list_unanswered), see what happened across hundreds of channels at once (recent_activity), review a whole forum in one call (read_forum), and explain who can access a channel and why (check_access), and catch up on messages that arrived while you were away (get_new_messages).Housekeeping and records: find channels idle for weeks and archive them in bulk (
list_inactive_channels,archive_channel), save tickets or threads as Markdown/JSON transcripts (export_messages), snapshot the server structure and see what changed since (server_snapshot), and get message statistics (message_stats).Ready-made workflows: MCP prompts for a server digest, forum triage, a reply queue and catching up, which appear as prompts or slash commands in your MCP client.
No secrets in the chat: webhook URLs/tokens never reach the model, and the bot token is never logged.
stdio and Streamable HTTP transports. HTTP binds to
127.0.0.1by default and supports a bearer token.
Related MCP server: Crow
Compared with SaseQ/discord-mcp
SaseQ/discord-mcp is the established Java server that inspired Guildora's feature set. Both are MIT-licensed. Differences as of November 2026:
SaseQ/discord-mcp | Guildora | |
Runtime | Java 17 + Spring Boot (Docker image or Maven build) | Node.js ≥ 22, |
Startup (stdio) | Spring Boot plus full member download, several seconds per client session | MCP handshake in ~0.5 s; Discord connects in the background |
Tools loaded | All 82 at once | 20 by default ( |
Inputs | Mostly raw IDs | IDs, mentions, links or names; ambiguous names list candidates |
Destructive actions | Run immediately | Dry run unless |
Archived threads | Usable only after | Fetched directly; private archived threads listed too |
Message search | Scans up to 1,000 messages in one channel | Discord server search when available; otherwise a configurable, reported scan |
HTTP mode | Listens on all interfaces, no auth | Loopback by default, optional bearer token, DNS-rebinding checks |
Webhooks | Returns webhook URLs (with tokens) to the model | Sends by webhook ID or name; tokens stay server-side |
Extras | — | Sees image attachments and reads text files, finds unanswered tickets, cross-channel activity, forum digests, access explanations, attachments and embeds in messages, custom-emoji reactions, pins, bulk delete, audit log, member list, thread creation, forum tags, stickers |
Tests / CI | No unit tests | Vitest suite (no token needed), CI on Ubuntu and Windows |
SaseQ also ships a Docker image and has a longer track record. If you already run it as a shared HTTP service, it works well for that. See docs/reference-analysis.md for the detailed study, and the tool mapping below.
Setup (about 5 minutes)
1. Create the bot
Open the Discord Developer Portal and click New Application. Give it a name and create it.
On General Information, copy the Application ID (you need it for the invite link).
Open the Bot page and click Reset Token, then Copy. This is your
DISCORD_TOKEN. It is shown only once. Do not confuse it with the Client Secret (OAuth2 page) or the Public Key; those will not work.Still on the Bot page, under Privileged Gateway Intents, turn on:
Message Content Intent: needed to read message text, embeds and attachments.
Server Members Intent: needed for
list_memberswithout a search query.
Guildora works without them, but tells you what is limited (
get_server_infoshows their state).
2. Invite the bot to your server
Replace YOUR_APPLICATION_ID and open the link while signed in to Discord:
Core pack (read and send messages, reactions, pins, delete messages):
https://discord.com/oauth2/authorize?client_id=YOUR_APPLICATION_ID&scope=bot&permissions=2252074691718208All packs (also channels, roles, moderation, threads, voice, events, webhooks, invites, emoji; still no Administrator):
https://discord.com/oauth2/authorize?client_id=YOUR_APPLICATION_ID&scope=bot&permissions=2279693375106295
Core: View Channels, Send Messages, Send Messages in Threads, Embed Links, Attach Files, Read Message History, Add Reactions, Pin Messages, Manage Messages.
All packs adds: Manage Channels, Manage Roles, Kick Members, Ban Members, Timeout Members, Manage Nicknames, View Audit Log, Manage Threads, Create Public/Private Threads, Connect, Move Members, Mute Members, Deafen Members, Create/Manage Events, Manage Webhooks, Create Invite, Manage Server (to list invites), Create/Manage Expressions.
Grant only what you need. For role and member actions, the bot's role must also be above the roles it manages (Server Settings > Roles, drag it up).
Optionally copy your server ID (enable Developer Mode in Discord's Advanced settings, then
right-click the server > Copy Server ID) and use it as DISCORD_GUILD_ID. If the bot is in
only one server, you can skip this.
3. Connect your MCP client
Claude Code
claude mcp add guildora -e DISCORD_TOKEN=your-bot-token -- npx -y guildora-mcpOn native Windows (not WSL), wrap npx with cmd /c:
claude mcp add guildora -e DISCORD_TOKEN=your-bot-token -- cmd /c npx -y guildora-mcpAdd more settings with extra -e flags, for example
-e DISCORD_GUILD_ID=123456789012345678 -e GUILDORA_PACKS=core,moderation,roles.
Note that the token ends up in your shell history and in Claude Code's config; see
Security for safer options.
Claude Desktop
Edit claude_desktop_config.json (Settings > Developer > Edit Config):
{
"mcpServers": {
"guildora": {
"command": "npx",
"args": ["-y", "guildora-mcp"],
"env": {
"DISCORD_TOKEN": "your-bot-token",
"DISCORD_GUILD_ID": "123456789012345678",
"GUILDORA_PACKS": "core,moderation"
}
}
}
}Restart Claude Desktop afterwards.
Other MCP clients (stdio)
Any client that can launch a command: command npx, arguments -y guildora-mcp, and the
environment variables below.
Streamable HTTP (one shared instance)
DISCORD_TOKEN=your-bot-token GUILDORA_TRANSPORT=http npx -y guildora-mcpThe endpoint is http://127.0.0.1:8085/mcp (stateless; GET /health reports status). Connect
Claude Code with:
claude mcp add --transport http guildora http://127.0.0.1:8085/mcpTo expose it beyond your machine, set GUILDORA_HOST=0.0.0.0 and GUILDORA_HTTP_TOKEN
(clients then send Authorization: Bearer <token>), and put it behind HTTPS.
4. Try it
Ask Claude: "Show me the server info", "Summarise the last 50 messages in #general", or "Find messages from alice mentioning the release".
Configuration
Variable | Required | Default | Purpose |
| yes | — | Bot token (Bot > Reset Token) |
| no | — | Default server, so tools may omit |
| no |
| Comma list of packs to enable; |
| no |
|
|
| no |
|
|
| no |
| HTTP bind address |
| no |
| HTTP port |
| no | — | Require |
| no |
| Folder where |
| no |
| Max messages scanned when Discord's server search is unavailable (100-10000) |
| no |
|
|
Startup fails fast with a clear message if the token is missing, malformed or rejected, and warns
about missing privileged intents. npx guildora-mcp --help prints this list.
Packs and tools
Each tool belongs to exactly one pack. core is always on. Read-only tools are marked; write tools
change something; destructive tools need confirm: true (otherwise they return a dry run).
72 tools in 10 packs.
core (20 tools) · enabled by default
Server info, channels, members, roles (read), messages, DMs, reactions, pins, search.
Tool | Kind | What it does |
| read-only | Overview of a Discord server: owner, member count, boost tier, channel/role/emoji counts, the bot's permissions and which privileged intents are on. |
| read-only | Lists server channels in sidebar order (categories with their channels), with IDs and types. |
| read-only | Details of one channel, category, thread or forum post: topic, category, slowmode, voice settings and who is connected, forum tags, thread state, and which key permissions the bot lacks there. |
| read-only | Lists server roles from highest to lowest with ID, position, color, flags and notable permissions. |
| read-only | Lists server members with IDs, roles and join date. |
| read-only | Full details of one server member: names, account and join dates, all roles, timeout, voice channel, boosting, key permissions, and whether the bot can kick/ban/timeout them (role hierarchy). |
| read-only | Reads recent messages from a channel, thread, forum post or DM, shown oldest first with IDs, authors, replies, attachments (names and IDs; get_message gives URLs), embeds and reactions. |
| read-only | Fetches one message by ID or link, with attachments (IDs, sizes, URLs), embeds, reactions and the message it replies to. |
| read-only | Opens a message's attachments so you can see them: images (screenshots, photos) come back as images, scaled down to a readable size; text files (logs, code, JSON, CSV) come back as text. |
| read-only | Finds messages by text, author, mentions, attachments/links (has), pinned state and date range. |
| read-only | Shows which channels and threads had messages from people since a time ("24h" by default, or "7d", an ISO date), newest first, with how many messages and people and the latest message (include_bots adds bot activity). |
| read-only | Returns messages that arrived across the server (or a channel, category or forum) since your last call, oldest first, from what Guildora received live during this session. |
| read-only | Finds channels, tickets, threads and forum posts where the latest message from a person is not from staff, i.e. |
| write | Sends a message to a channel, thread, forum post or a user's DMs (pass "user"). |
| write | Edits a message the bot sent (content and/or embeds). |
| destructive | Deletes one message (the bot's own, or anyone's with Manage Messages). |
| write | Reacts to a message with a Unicode or custom server emoji. |
| write | Removes a reaction from a message: the bot's own by default, or another member's (needs Manage Messages). |
| write | Pins a message (pinned: true, default) or unpins it (pinned: false). |
| read-only | Explains channel access after roles and overwrites are combined. |
channels (8 tools)
Create, edit, move and delete channels and categories; permission overwrites.
Tool | Kind | What it does |
| write | Creates a text, voice, announcement, stage, forum or media channel, or a category. |
| write | Renames, moves (category, position) or changes settings of any channel or category: topic, NSFW, slowmode, voice bitrate/user limit/region, forum default sort and layout. |
| destructive | Permanently deletes a channel, category, thread or forum post with all its messages. |
| read-only | Lists channels with no messages for a while ("30d" by default), longest idle first, and how many of Discord's 500 channels the server uses. |
| destructive | Moves up to 50 channels into a private "Archive" category (created if missing; "Archive 2" etc. |
| read-only | Lists a channel's or category's permission overwrites: for each role or member, which permissions are explicitly allowed and denied (everything else is inherited from roles). |
| write | Allows, denies or resets (back to inherited) permissions for a role or member on one channel or category. |
| destructive | Removes a role's or member's whole permission overwrite from a channel, so they fall back to their role permissions. |
roles (5 tools)
Create, edit and delete roles; give and take roles from members.
Tool | Kind | What it does |
| write | Creates a role with a name, color ("#5865F2" or a name like "Blurple"), permission names, and display options. |
| write | Changes a role's name, color, hoist, mentionable flag, position or permissions. |
| destructive | Permanently deletes a role; members lose it. |
| write | Gives one or more roles to a member. |
| write | Removes one or more roles from a member. |
moderation (8 tools)
Kick, ban, unban, timeout, nicknames, bulk delete, audit log.
Tool | Kind | What it does |
| destructive | Removes a member from the server; they can rejoin with an invite. |
| destructive | Bans a user so they cannot rejoin; works for current members and for users who already left (pass their user ID). |
| write | Lifts a ban so the user can rejoin with an invite. |
| read-only | Lists banned users with their ban reasons, in pages (pass next_cursor as cursor). |
| write | Times a member out (they cannot send messages, react or join voice) for a duration such as "10m", "1h" or "7d" (max 28 days). |
| write | Sets a member's server nickname, or resets it with an empty string. |
| destructive | Deletes many recent messages in one channel at once: scans the last |
| read-only | Reads recent audit log entries (who did what, to whom, why), newest first. |
threads (5 tools)
Threads and forum posts (including archived), forum tags.
Tool | Kind | What it does |
| read-only | Lists threads or forum posts. |
| read-only | Reads a forum or media channel in one call: each post with its title, tags, author, message count, last activity and opening message, optionally the latest replies. |
| write | Starts a thread in a text/announcement channel (from an existing message, or standalone; private: true for an invite-only thread), or creates a forum/media post with a first message, tags, embeds and files. |
| write | Renames, archives/unarchives, locks/unlocks, pins (forum posts), sets tags, slowmode or auto-archive of a thread or forum post, including archived ones (by ID or link). |
| write | Adds, updates or removes the tags available in a forum or media channel (max 20). |
voice (8 tools)
Move, disconnect, mute and deafen voice members; scheduled events.
Tool | Kind | What it does |
| write | Moves a member who is connected to voice into another voice or stage channel. |
| write | Disconnects a member from their current voice or stage channel. |
| write | Server-mutes/unmutes and/or server-deafens/undeafens a member in voice. |
| read-only | Lists the server's scheduled events (upcoming and active) with type, status, times, location and interest count. |
| write | Schedules a server event: type "voice" or "stage" (in a channel) or "external" (a location or link, needs an end time). |
| write | Changes a scheduled event's name, description, times, channel or location, or its status: "active" starts it, "completed" ends it, "canceled" cancels a scheduled one. |
| destructive | Permanently deletes a scheduled event (use edit_event status "canceled" to cancel it visibly instead). |
| read-only | Lists users who marked themselves interested in a scheduled event, in pages. |
webhooks (4 tools)
List, create and delete webhooks; send messages through them.
Tool | Kind | What it does |
| read-only | Lists webhooks in the server or one channel with ID, name, type, channel and creator. |
| write | Creates an incoming webhook in a channel, optionally with an avatar. |
| destructive | Deletes a webhook; anything using its URL stops working. |
| write | Posts a message through a webhook (chosen by ID or name), optionally with a custom display name and avatar, embeds and files. |
invites (4 tools)
List, create, inspect and revoke invites.
Tool | Kind | What it does |
| read-only | Lists active invites of the server (or one channel) with uses, limits, expiry and creator. |
| write | Creates an invite link to a channel. |
| read-only | Shows what any invite code or link points to: server, channel, inviter, expiry and approximate member counts. |
| destructive | Revokes an invite so the link stops working. |
emoji (7 tools)
Custom emoji and stickers.
Tool | Kind | What it does |
| read-only | Lists the server's custom emoji with the code to use in messages (<:name:id>), animated/managed flags and role restrictions. |
| write | Uploads a custom emoji from an image (max 256 KB). |
| write | Renames a custom emoji and/or sets which roles can use it ([] = everyone). |
| destructive | Permanently deletes a custom emoji. |
| read-only | Lists the server's custom stickers with ID, format, related emoji tag and description. |
| write | Uploads a custom sticker from a PNG, APNG, GIF (max 512 KB, 320x320) or Lottie JSON file. |
| destructive | Permanently deletes a custom sticker. |
insights (3 tools)
Export conversations, server snapshots and comparisons, message statistics.
Tool | Kind | What it does |
| read-only | Saves a channel, ticket, thread, forum post or DM to a Markdown transcript or JSON file (authors, times, replies, attachment links, embeds, reactions). |
| read-only | Saves the server's structure as JSON (settings, roles with permissions, categories and channels with their permission overwrites, emoji) to GUILDORA_EXPORT_DIR, e.g. |
| read-only | Counts messages over a period ("7d" by default) for the server or a category/channel: totals for people and bots, the busiest channels, the most active people, messages per day and the busiest hours (UTC). |
Prompts
Guildora also offers MCP prompts: ready-made workflows your client shows as prompts or slash
commands (in Claude Code: /mcp__guildora__server_digest and so on). They only use enabled tools, and
they never send or change anything without your approval; in read-only mode they only draft.
Prompt | What it does | Arguments |
| Highlights, who is waiting for staff, and activity by channel |
|
| Reviews forum posts (screenshots included), rates severity, drafts replies |
|
| Lists conversations waiting for staff, longest first, with draft replies |
|
| Summarises messages received this session, mentions of the bot first |
|
Inputs
Tools resolve what you give them, so the model does not need lookup calls first:
Argument | Accepts |
channel / category / thread |
|
role | ID, |
member / user | ID, |
emoji |
|
message | ID (with |
server ( | ID or name; optional with |
durations |
|
colors |
|
permissions |
|
Name matching ignores case, emoji and punctuation. If a name matches several items, the tool
returns an error listing them with IDs. Archived threads are not in the name cache, so pass them
by ID or link (list_threads shows them).
Safety
Confirmation: destructive tools (
delete_message,delete_channel,delete_role,kick_member,ban_member,bulk_delete_messages,delete_permission_overwrite,delete_webhook,delete_invite,delete_event,delete_emoji,delete_sticker) first returnDRY RUN: nothing was changed. Would: …with warnings (for example "its 4 channels move out of the category"). Only a second call with"confirm": trueacts.bulk_delete_messagesgives anup_toID so the confirmed call deletes exactly the previewed set.Read-only mode:
GUILDORA_READ_ONLY=trueremoves every write and destructive tool from the tool list, so they cannot be called at all.Pre-flight checks: role hierarchy, server owner, missing bot permissions and Discord limits (2,000 characters, 14-day bulk delete, 28-day timeout) are checked before calling Discord.
Mentions:
@everyone/@hereonly ping whenmention_everyone: true.Files: local paths work only in stdio mode (where the server runs as you). URLs must be https, are size-limited, do not follow redirects, and are refused if they resolve to private or local addresses.
HTTP: loopback by default, Host/Origin checks against DNS rebinding, optional bearer token.
Secrets: the token is never logged; logs go to stderr; webhook tokens never reach the model.
See SECURITY.md for reporting vulnerabilities and token-handling advice.
Search and limits
search_messagesuses Discord's server-wide search when the bot can (whole history, all channels, filters for author, mentions,has, pinned, dates). If it is unavailable, still indexing, orscan: trueis passed, it scans one channel's history up toGUILDORA_SCAN_LIMITand states how many messages it scanned and whether it reached the start, with a cursor to go on.Lists take
limitand returnnext_cursor; nothing dumps thousands of items.Rate limits are queued by discord.js. A call that had to wait says so; a wait over 10 seconds fails with the retry time instead of hanging.
Coming from SaseQ/discord-mcp
SaseQ tool(s) | Guildora |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| same names |
|
|
| same names |
|
|
|
|
| same names |
|
|
|
|
| same names (by ID or name, no URLs) |
|
|
|
|
|
|
|
|
|
|
| same names |
Nothing was dropped. Merged tools keep the options of the originals; raw permission bitfields and decimal colors are replaced by permission names and hex or named colors.
Development
git clone https://github.com/az-xx/guildora-mcp.git
cd guildora-mcp
npm install
npm test # unit tests, no token needed
npm run build
npm run docs:tools # regenerate the tool tables in this READMEnpm run test:live runs a smoke test against a real server when DISCORD_TOKEN and
GUILDORA_TEST_GUILD_ID are set (for example in a local .env, which is git-ignored). See
CONTRIBUTING.md.
Credits
Feature set inspired by SaseQ/discord-mcp (MIT). Built with discord.js and the MCP TypeScript SDK.
License
MIT © Guildora contributors
Available Tools
20 toolsadd_reactionAdd a reactionCIdempotent
Reacts to a message with a Unicode or custom server emoji.
Inputs: emoji (required), message (required), user, guild, +1 more.
check_accessCheck who can access a channelARead-onlyIdempotent
Explains channel access after roles and overwrites are combined. With "member" or "role": what they can and cannot do there, and which overwrites cause it. Without either: who can see the channel (roles, specific members, and a member count when available). Use it to check private ticket or staff channels.
Inputs: channel (required), role, guild, member.
delete_messageDelete a messageADestructive
Deletes one message (the bot's own, or anyone's with Manage Messages). Destructive: returns a dry run unless confirm is true. For many messages use bulk_delete_messages (moderation pack).
Inputs: message (required), user, guild, reason, +2 more.
edit_messageEdit a messageAIdempotent
Edits a message the bot sent (content and/or embeds). suppress_embeds hides link previews on any message (needs Manage Messages for others' messages). Bots cannot change other users' text.
Inputs: message (required), user, guild, embeds, +3 more.
get_attachmentOpen message attachmentsARead-onlyIdempotent
Opens a message's attachments so you can see them: images (screenshots, photos) come back as images, scaled down to a readable size; text files (logs, code, JSON, CSV) come back as text. Other files are listed with their size and URL. Pick one with "attachment" (ID or file name), or get all (up to 4 images).
Inputs: message (required), user, guild, channel, +2 more.
get_channelGet channel detailsARead-onlyIdempotent
Details of one channel, category, thread or forum post: topic, category, slowmode, voice settings and who is connected, forum tags, thread state, and which key permissions the bot lacks there. Works for archived threads by ID or link.
Inputs: channel (required), guild.
get_memberGet member detailsARead-onlyIdempotent
Full details of one server member: names, account and join dates, all roles, timeout, voice channel, boosting, key permissions, and whether the bot can kick/ban/timeout them (role hierarchy).
Inputs: member (required), guild.
get_messageGet one messageARead-onlyIdempotent
Fetches one message by ID or link, with attachments (IDs, sizes, URLs), embeds, reactions and the message it replies to. include_replies: true also scans later messages for replies to it and says how many it scanned.
Inputs: message (required), user, guild, channel, +2 more.
get_new_messagesGet new messagesARead-onlyIdempotent
Returns messages that arrived across the server (or a channel, category or forum) since your last call, oldest first, from what Guildora received live during this session. Pass the returned next_cursor next time to get only newer ones. only_mentions keeps messages that mention or reply to the bot. For older history use recent_activity or read_messages.
Inputs: guild, limit, scope, cursor, +2 more.
get_server_infoGet server infoARead-onlyIdempotent
Overview of a Discord server: owner, member count, boost tier, channel/role/emoji counts, the bot's permissions and which privileged intents are on. Call this first to orient yourself. If the bot is in several servers and none is the default, the error lists them.
Inputs: guild.
list_channelsList channelsARead-onlyIdempotent
Lists server channels in sidebar order (categories with their channels), with IDs and types. Filter by type, category or a name fragment; type "thread" lists active threads (archived ones: list_threads). Use get_channel for details of one channel.
Inputs: type, guild, limit, query, +2 more.
list_membersList or search membersARead-onlyIdempotent
Lists server members with IDs, roles and join date. With "query", searches usernames and nicknames that start with the text (no special intent needed). Without a query it pages through all members, which needs the Server Members intent. "role" keeps only members with that role. Use get_member for one member.
Inputs: role, guild, limit, query, +1 more.
list_rolesList rolesARead-onlyIdempotent
Lists server roles from highest to lowest with ID, position, color, flags and notable permissions. Marks the bot's highest role: the bot can only manage roles below it.
Inputs: guild, limit, query, cursor.
list_unansweredFind conversations waiting for staffARead-onlyIdempotent
Finds channels, tickets, threads and forum posts where the latest message from a person is not from staff, i.e. someone is waiting for a reply; sorted by longest wait. Staff = members with staff_roles, or by default anyone with Administrator, Manage Server, Manage Channels, Manage Messages or Timeout Members. Bot messages are ignored unless bot_replies_count is true.
Inputs: guild, limit, scope, since, +4 more.
pin_messagePin or unpin a messageBIdempotent
Pins a message (pinned: true, default) or unpins it (pinned: false). Max 50 pins per channel.
Inputs: message (required), user, guild, pinned, +1 more.
read_messagesRead messagesARead-onlyIdempotent
Reads recent messages from a channel, thread, forum post or DM, shown oldest first with IDs, authors, replies, attachments (names and IDs; get_message gives URLs), embeds and reactions. Page with before/after/around (message ID or ISO date). pinned: true lists pinned messages instead. To find messages by text or author, use search_messages.
Inputs: user, after, guild, limit, +4 more.
recent_activityRecent activity across channelsARead-onlyIdempotent
Shows which channels and threads had messages from people since a time ("24h" by default, or "7d", an ISO date), newest first, with how many messages and people and the latest message (include_bots adds bot activity). Use it to see what is going on without opening channels one by one; then read_messages.
Inputs: guild, limit, scope, since, +2 more.
remove_reactionRemove a reactionAIdempotent
Removes a reaction from a message: the bot's own by default, or another member's (needs Manage Messages).
Inputs: emoji (required), message (required), user, guild, +2 more.
search_messagesSearch messagesARead-onlyIdempotent
Finds messages by text, author, mentions, attachments/links (has), pinned state and date range. Uses Discord's server-wide search when available (whole history, all channels). Otherwise, or if scan: true, it scans one channel's history up to scan_limit and states exactly how much it scanned. Results include message IDs and channels; use get_message or read_messages around=ID for context.
Inputs: has, scan, sort, after, +10 more.
send_messageSend a messageA
Sends a message to a channel, thread, forum post or a user's DMs (pass "user"). Supports replies, up to 10 embeds and 10 file attachments (local path in stdio mode, https URL, or base64). Content max 2000 characters. @everyone/@here only ping if mention_everyone is true. Returns the new message ID and link. To start a new forum post, use create_thread.
Inputs: user, files, guild, embeds, +5 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 20 tools
Most tools target a distinct resource+action, and the four message-reading tools (read_messages, search_messages, recent_activity, get_new_messages) are separated by explicit descriptions of when to use each. However, list_unanswered and recent_activity both answer 'what needs attention', and get_message vs read_messages around=ID create mild overlap that requires reading descriptions to resolve.
Mostly a predictable verb_noun snake_case pattern (list_channels, get_channel, send_message, delete_message, pin_message). A few deviations break the pattern: recent_activity is a bare noun phrase and list_unanswered uses verb_adjective rather than verb_noun.
At 20 tools it sits at the top of the comfortable range, but each tool maps to a recognizable Discord operation (read, send, edit, react, moderate, inspect). The count is slightly heavy given several read-path variants that could be consolidated.
Read/inspect and message lifecycle are well covered, but write-side moderation and structure are missing: no kick/ban/timeout, no role assignment or channel/thread creation. Worse, send_message tells the agent to 'use create_thread' and delete_message points at bulk_delete_messages, neither of which exists in this surface — real dead ends.
Maintenance
Related MCP Connectors
Discord MCP server for ChatGPT, Claude and any AI agent: list servers and channels, read channel messages, search messages, send message, reply to message, send DM, read mentions and assign role in your own Discord account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Discord yourself; Cotlet does not store your password and you need no Discord API key. About the official Discord API: Yes, Discord has an official API for bots and OAuth2 apps, but it acts as a bot that a server manager adds, not as you, and Discord has no official MCP server for it (checked 5 Nov 2026). The MCP server on Discord's docs site only searches documentation. Setup and FAQ: https://cotlet.dev/integrations/discord-api-mcp-server
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
One OAuth connector for your team's remote MCP servers, with Tool Packs, guardrails and logs.
Related MCP Servers
- 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
- AlicenseNot gradedqualityFmaintenanceMCP server that gives AI agents first-class access to Discord, enabling discovery, messaging, channel management, moderation, and arbitrary REST calls through typed, consent-aware tools.12 npm3MIT
- FlicenseNot gradedqualityCmaintenanceEnables MCP clients to read, post to, and moderate a Discord server through the Discord REST API, with opt-in guardrails and dry-run safeguards.-
- AlicenseAqualityCmaintenanceEnables Claude or any MCP client to operate a Discord bot through 35 tools, covering reading channels, searching history, posting and replying, managing channels, threads and roles, moderating members, and reading the audit log. It runs locally as a stateless subprocess, making plain HTTPS calls to Discord's REST API with no gateway connection.35MIT