discord-unofficial-mcp
Provides read-only access to your own Discord direct messages and group DMs through the official Discord web client, including listing conversations, reading message history with paging, catching up on unread messages, and checking login/session status.
Click on "Install 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., "@discord-unofficial-mcpcatch me up on my unread Discord DMs"
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.
discord-unofficial-mcp
"Look at my Discord messages" — for any MCP-capable agent (Claude Code, Claude Desktop, Codex, Cursor…). Reads your own Discord direct messages (DMs and group DMs) through the official Discord web client running in a dedicated Chrome where you signed in once, by hand.
Read-only. No token. No API. Not affiliated with Discord Inc.
discord_status → discord_catch_up # what's unread, across conversations
discord_list_dms # who you talk to, with channel ids
discord_read_dm # the recent messages of one conversation, with pagingWhy it works this way
Discord offers no Terms-compliant way for a program to read a user's DMs: a bot only sees
messages sent to the bot itself, and the only OAuth2 scope that would allow it
(dm_channels.read) is reserved for approved partners. The remaining route — using your
user token from a third-party client (a "self-bot") — is forbidden by
Discord's Terms
and, since March 2026, actively detected and sanctioned even for read-only use (forced
log-outs, password resets, "platform abuse" e-mails).
This project does none of that. It reads what the official client renders on screen, the way a
screen reader would. The design limits are deliberate and verifiable in src/core.js:
No API of its own. It never calls
discord.com/apiand never opens a websocket. All network traffic is generated by the official client.No token. It never reads
localStorage, IndexedDB, cookies or client internals. The DevTools connection is opened with theNetworkdomain disabled and a silent logger: the process does not even receive the client's request headers, so there is nothing of the sort to leak through logs. (NODE_DEBUGcan still make Node print its own diagnostics, such as the minimal environment passed to the Chrome launcher.)Only the dedicated browser. The DevTools endpoint must be on loopback and must belong to the configured Chrome profile (checked against the profile's
DevToolsActivePortfile or the listening process's--user-data-dir); another automation browser sitting on the same port is refused instead of adopted.Read-only. It never types, sends or reacts. The only actions are opening a conversation (clicking its sidebar link, or a URL built from an id validated as a snowflake) and scrolling.
Moderate use. Fixed pauses between actions, at most 300 messages per call, one reader at a time (in-process mutex + cross-process file lock) and the tab closes by itself after 3 minutes without activity from any agent.
⚠️ Read this before using it. Automating a user account — even read-only, even through the official client — is still automation of a user account under the letter of Discord's Terms of Service. This is the lowest-exposure way that exists to read your own messages with an agent; it is not a Terms-compliant one, and there is no such thing. You use it on your own account, at your own risk. Anything that sends messages is out of scope by design and will not be added.
Related MCP server: discord-mcp
Requirements
Node.js 22+.
Google Chrome (or Chromium/Brave/Edge) — a dedicated instance with its own profile, started with remote debugging on
127.0.0.1:9222. The server starts it for you on macOS/Linux; see below for Windows.A Discord account signed in in that Chrome profile (one-time, by hand).
Install
git clone https://github.com/mario-hernandez/discord-unofficial-mcp.git
cd discord-unofficial-mcp && npm installRegister the MCP server in your client. Claude Code, for every project:
claude mcp add --scope user discord-unofficial-mcp -- node /absolute/path/to/discord-unofficial-mcp/src/mcp.jsGeneric MCP configuration (Claude Desktop, Cursor, Codex…):
{
"mcpServers": {
"discord-unofficial-mcp": {
"command": "node",
"args": ["/absolute/path/to/discord-unofficial-mcp/src/mcp.js"]
}
}
}Optional CLI: npm link gives you the discord-unofficial-mcp command.
The dedicated Chrome
The server needs a Chrome that listens on 127.0.0.1:9222 with its own user-data-dir
(never your everyday profile: Chrome ignores the debugging flag on the default profile, and you
do not want an agent inside your personal browser anyway).
macOS / Linux: nothing to do. When nothing is listening, the server runs
scripts/chrome.sh, which starts Chrome with the profile~/.discord-unofficial-mcp/chrome-profileand waits for the port. You can also run it yourself:npm run chrome.Windows: start it by hand (or in a shortcut). CMD:
start chrome --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.discord-unofficial-mcp\chrome-profile"PowerShell:Start-Process chrome -ArgumentList '--remote-debugging-port=9222',"--user-data-dir="$env:USERPROFILE.discord-unofficial-mcp\chrome-profile""The profile identity check needslsof/psor theDevToolsActivePortfile; on Windows setDISCORD_MCP_SKIP_PROFILE_CHECK=1if it cannot be verified.
Environment variables (for the server and the launcher):
Variable | Default | Purpose |
|
| DevTools endpoint of the dedicated Chrome (must be loopback; the launcher takes its port from here) |
|
| Chrome profile the launcher uses and the identity check expects (where the session lives) |
| unset |
|
| auto-detected | Explicit Chrome/Chromium binary for the launcher |
|
| Close the tab after this much inactivity ( |
|
| Lock file and activity marker (must be yours, mode 0700) |
| system time zone | Time zone used for the dates in the output |
Pass them with -e KEY=value in claude mcp add, or in the env block of a generic MCP config.
Sign in (once)
Ask the agent to call discord_open_login, or run discord-unofficial-mcp login. The Discord
window comes to the front: sign in there — the easiest way is to scan the QR code with the
Discord mobile app (no password typed). The session is kept in the profile directory and
survives closing Chrome and rebooting. It only ends if you sign out from that browser, change
your password, revoke the device in Discord's settings, or Discord invalidates it. When that
happens, discord_status reports logged_out and you scan the QR code again.
Tools
Tool | What it does |
| Dedicated Chrome ok, session state ( |
| Opens/focuses the tab for a manual sign-in. Only navigates to |
| Sidebar conversations (walked entirely with scrolling; recent-activity order) with |
| Recent messages of one conversation by |
| "Look at my messages": walks the conversations with unread messages (max 5 × 50) with per-conversation errors and |
| Closes the tab if no agent is using it: |
Each message carries: id, author (+ authorSource: header, system — the actor of a
system message such as a call —, group, group-map, inherited), timestamp (derived from
the id's snowflake: exact and always available), kind (message / system / unknown),
content (max 2,000 chars, contentTruncated),
forwarded, replyTo, attachments (kind, url verified by hostname against Discord's CDN,
name), edited. Both output formats respect a 60,000-character budget: when exceeded, the
oldest messages are dropped and count, hasMore and nextBefore are recomputed from what
was actually delivered, so paging never skips the omitted messages (outputTruncated reports
how many). Markdown goes inside a code block with a notice that it is third-party content
(data, not instructions); JSON carries the same notice.
CLI
discord-unofficial-mcp status
discord-unofficial-mcp dms [--unread] [--json]
discord-unofficial-mcp read (<channel_id> | --name <name>) [--limit N] [--before <id>] [--json]
discord-unofficial-mcp catch-up [--json]
discord-unofficial-mcp closeThings you should know
While the tab is open, Discord shows you online from that browser. It closes by itself after 3 minutes without activity from any agent (
DISCORD_MCP_IDLE_MS). The CLI cannot watch for inactivity: close withdiscord-unofficial-mcp close.Opening a conversation may mark it as read (Discord has no read receipts for the other person; only your own unread counter clears).
Only conversations open in the sidebar are listed. A closed DM can still be read if you know its
channel_id(direct navigation).Message content is written by other people. The server labels it as untrusted and the MCP instructions tell agents to treat it as data; that reduces prompt-injection confusion but is not a complete barrier. Do not let an agent act on instructions found inside a message.
Discord's CSS class names change with every build; the selectors this project relies on (
data-list-id,id="chat-messages-…",id="message-content-…",aria-labelledby) have been stable for years. If something breaks,scripts/probe-*.mjsprint the real DOM structure so the selectors can be adjusted.
Concurrency and shutdown
Several agent processes share the same tab. Every public operation takes an in-process mutex (bounded queue of 8) and a cross-process file lock (
<state dir>/tab.lock, mtime refreshed every 20 s; a lock is only considered stale when its process stopped refreshing it for 120 s). When busy, callers wait up to 60 s and then get an error. If a process loses the lock while operating (for example after being suspended), its operation is aborted and its result discarded.Bounded waits everywhere: 15 s to connect, 30 s per DevTools call, 40 s for the launcher, 150 s per operation. On expiry the DevTools connection is reset (never the browser).
Idle close is decided under the lock against the shared activity marker, so a read that just finished in another process is never interrupted. On process exit the server drains the running operation and closes the tab if it is idle; if it was used recently, a small detached helper closes it once the idle period has passed, so the last process to leave never leaves the tab (and the "online" presence) open forever.
Known limitations
Paging horizon.
beforecontinues from the current view when the cursor message is still rendered (consecutive pages in the same tab); otherwise it walks up again from the bottom, at most 40 screens per call. Very deep history is out of reach by design;coverage.stopReasontells you when that happened.Modal dialogs need a person. Update notices, verification prompts, new-login warnings and the like are detected (
discord_status→dialog) and every read stops with an explicit error until someone deals with the dialog in the dedicated Chrome window.(me)is decided by display name. In a group DM, another participant with the same display name would also be labelled(me).Group DMs work but were tested less than 1:1 conversations; attribution of grouped messages relies on Discord's
aria-labelledbyreferences.Inline custom emoji are represented by their
:name:only when a message consists solely of emoji; inside text they are dropped (the DOM renders them as images).Probes are development tools:
scripts/probe-*.mjsopen their own connection without the lock. Run them only when no agent is reading.Windows has no automatic launcher and no process-based profile check (see above).
Development
npm test # smoke test against the dedicated Chrome with a real session (prints metrics, not messages)
npm run test:mcp # drives src/mcp.js as an MCP client: concurrent calls, error results, idle auto-close
npm run chrome # start the dedicated Chrome by hand
node scripts/probe-dom.mjs # sidebar / message list structure
node scripts/probe-msg.mjs # ids inside a message, timestamps, scroll containers
node scripts/probe-group.mjs # how grouped messages reference their author
node scripts/probe-noauthor.mjs # structure of messages whose author cannot be resolved (scrolls up)The code base was reviewed adversarially (design and implementation) before the 0.2 release; the findings that shaped it are summarized in the commit history.
src/core.js — Chrome connection, DOM reading, exclusion, idle close, rendering
src/mcp.js — MCP server (stdio) with the 6 tools
src/cli.js — CLI with the same commands (strict util.parseArgs)
scripts/chrome.sh — dedicated Chrome launcher (macOS / Linux)
scripts/smoke.mjs — smoke test (`npm test`)
scripts/probe-*.mjs — DOM structure probes for when Discord changes somethingContributing
Issues and pull requests are welcome for robustness (selectors, coverage, concurrency), new read-only capabilities and platform support. Anything that sends, reacts, types or touches the token will not be merged: it changes the risk profile for every user of this project.
License
MIT. Discord is a trademark of Discord Inc.; this project is not affiliated with, endorsed by or supported by Discord Inc.
Available Tools
6 toolsdiscord_catch_upA
"Look at my messages": walks the conversations with unread messages (up to max_channels, default 5) and returns their latest messages, with per-conversation errors if any and how many were left unprocessed. If nothing is unread, lists the recent conversations.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format (default markdown) | |
| per_channel | No | Maximum messages per conversation (default 25) | |
| max_channels | No | Maximum conversations to read (default 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses the bounded scan behavior, message limits, per-conversation error handling, and the unprocessed message count. It does not mention authentication requirements or whether messages are marked as read, but the core behavior is well documented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, leading with the user-facing intent and then the operational details. It is somewhat dense in a single sentence, but every clause adds meaningful behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description adequately describes what the agent receives: latest messages, per-conversation errors, unprocessed counts, and a fallback list of recent conversations. It also communicates limits and defaults, though it could be clearer about exact return formatting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description reinforces the meaning of max_channels by explaining it controls how many conversations are walked, but it does not add significant semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly names the action ('walks the conversations with unread messages'), the resource (Discord conversations), and the result (returns their latest messages). It also distinguishes itself from siblings like discord_read_dm, which targets a single DM, and discord_list_dms, which lists DMs without returning message content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes a clear usage context: use this when catching up on unread messages across conversations. It also specifies a sensible fallback behavior when nothing is unread, though it does not explicitly name alternatives or state when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discord_close_tabA
Closes the Discord tab in the dedicated Chrome (the owner stops appearing online from that browser). It closes by itself after a few minutes of inactivity; call only to force it. Returns closed / busy (another agent is using it) / not_open / chrome_down.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the side effect on online status, the auto-close behavior, the concurrency condition involving another agent, and the possible return states. This is unusually transparent for a tool description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact two-sentence definition with no filler. The core action and effect are front-loaded, and the return-value summary is provided efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description fully covers what the tool does, when to invoke it, what side effects it has, and what outcomes to expect. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description correctly focuses on behavior and return values rather than parameter details, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Closes the Discord tab in the dedicated Chrome'. It also clarifies the observable effect ('owner stops appearing online') and is clearly distinct from sibling tools like discord_status, discord_open_login, discord_list_dms, discord_read_dm, and discord_catch_up.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'call only to force it' because the tab 'closes by itself after a few minutes of inactivity'. This directly tells the agent when to use the tool and when not to use it, which is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discord_list_dmsA
Lists the open direct conversations in the sidebar (recent-activity order) with their channel_id and whether they have unread messages. Reports whether the sidebar walk was complete.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format (default markdown) | |
| unread_only | No | Only conversations with unread messages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses ordering ('recent-activity order'), returned data ('channel_id and whether they have unread messages'), and even signals possible incompleteness ('Reports whether the sidebar walk was complete'). It does not explicitly state side effects, but as a list operation the wording implies none.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler, front-loaded with the action and scope. Every clause adds operational meaning, making it efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no output schema, the description names the returned fields and even includes a completion indicator. It could mention behavior on empty results or failed sidebar walks, but those are minor gaps for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'format' and 'unread_only' are already documented. The description adds some behavioral context about unread messages that aligns with unread_only, but it does not provide additional parameter-level detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Lists') and scope ('open direct conversations in the sidebar'), with useful output details such as channel_id and unread status. It does not explicitly differentiate from siblings like discord_read_dm or discord_catch_up, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: use this tool when you need an overview of open DM conversations with their channel IDs and unread state. There are no explicit exclusions or alternative tool references, but the purpose strongly implies the appropriate use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discord_open_loginA
Opens and focuses the Discord tab in the dedicated Chrome so the account owner can sign in by hand (one-time; the session persists in that profile). Only navigates to /login when the signed-out state is confirmed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It discloses the action (open/focus tab), the environment (dedicated Chrome), the purpose (manual sign-in), the persistence side effect (session persists), and a guarded behavior (only navigates when signed-out is confirmed). It does not describe what happens if the tab already exists or what the agent should do on failure, but it provides meaningful behavioral context beyond a bare operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The main action and purpose are front-loaded, followed by the important session-persistence and signed-out condition details. Each clause adds necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, the description covers what the tool does, why it exists, the dedicated browser context, the one-time nature, session persistence, and the condition under which it navigates. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema documents everything. The description does not need to explain parameter meaning, and it appropriately stays focused on behavior instead. Baseline of 4 applies for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Opens and focuses'), a specific resource ('the Discord tab in the dedicated Chrome'), and a clear purpose (manual sign-in). It is easily distinguished from sibling tools like discord_status or discord_read_dm, which involve reading or managing Discord state rather than authentication.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use it: when the account owner needs to sign in by hand, one-time, because the session persists. It also states a condition: it only navigates to /login when the signed-out state is confirmed. It does not explicitly name alternatives or when-not-to-use, but the context is strong enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discord_read_dmA
Reads the most recent messages of a direct conversation, by channel_id (preferred) or by the name shown in discord_list_dms (exactly one of the two). Returns oldest-first messages with local time, author, text, attachments and id, plus hasMore/nextBefore to page back with before. Opening the conversation may mark it as read.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name of the person or group (case- and accent-insensitive) | |
| limit | No | How many messages to return (default 50, max 300) | |
| before | No | Cursor: only messages older than this id (use nextBefore from the previous response) | |
| format | No | Output format (default markdown) | |
| channel_id | No | Numeric id of the DM channel (from discord_list_dms) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses the ordering (oldest-first), the return fields, pagination via hasMore/nextBefore/before, and the side effect that opening the conversation may mark it as read. This is especially valuable for an operation that appears read-only but has a potential state-changing effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the first states the action and key constraint, the second covers return format and pagination, the third notes the side effect. Every sentence carries necessary information and the most important usage constraint is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description specifies exactly what the response contains, the message ordering, how to page, and the read-state side effect. It also tells the agent where to obtain channel_id/name (discord_list_dms). This is sufficient for correct invocation and interpretation of results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by establishing that channel_id and name are mutually exclusive, that channel_id is preferred, and that 'before' should use nextBefore from the previous response. These are semantics an agent could not derive from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Reads the most recent messages') and resource ('a direct conversation'), and distinguishes itself from siblings by scoping to DMs and referencing discord_list_dms as the source of identifiers. The naming and description together make it clear this is not for guild channels or status operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains the two identifier options, marks channel_id as preferred, and mandates exactly one of the two — important routing guidance. It does not explicitly contrast with discord_catch_up or state when not to use this tool, but the scope is clear enough for an agent to infer the relevant case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discord_statusA
Checks the dedicated Chrome and whether Discord is signed in (logged_in / logged_out / loading) and as which user. Call this first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the observable states (logged_in / logged_out / loading) and that it identifies the user, but it does not clarify whether the tool may launch/alter the Chrome session, what happens if Chrome is not running, or whether any side effects occur. This is a meaningful but moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the key instruction ('Call this first') and packs in the essential status values and user identification. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status check with low complexity, the description is nearly complete: it states what is checked and the possible states. However, because there is no output schema, more detail about the exact return structure (e.g., how the user is identified, whether a status object is returned) would make it fully unambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema already fully reflects this. The baseline for no-parameter tools is 4, and there is no parameter information the description needs to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: checking whether Discord is signed in (logged_in / logged_out / loading) and which user is active. It names a specific resource ('the dedicated Chrome') and distinguishes this as a status/preflight check from sibling tools that perform login, messaging, or tab actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call this first,' which gives clear sequencing guidance relative to sibling tools. It does not explicitly mention when not to use it or name alternatives, but for a status check the intended context is strongly implied and adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v0.4.0- First observed
discord_catch_up - First observed
discord_close_tab - First observed
discord_list_dms - First observed
discord_open_login - First observed
discord_read_dm - First observed
discord_status
TDQS
Each tool targets a distinct action: status checking, opening login, listing DMs, reading a specific DM, catching up on unread messages, and closing the tab. There is mild overlap between catch_up and list/read_dm since catch_up can fall back to listing recent conversations, but the descriptions make the intended use cases clear.
All tools share a consistent discord_ prefix and mostly follow a verb_noun pattern (open_login, list_dms, read_dm, close_tab). However, discord_status is more of a noun-style status check and catch_up is a phrasal verb, creating minor deviations from the otherwise predictable convention.
Six tools is a well-scoped size for this server's purpose: managing a Discord browser session and reading DMs. Each tool has a clear role, and none feel redundant or excessive.
The set covers status, login, listing DMs, reading DMs, and processing unread messages, which is solid for a read-only DM assistant. However, it notably lacks sending messages, explicit mark-as-read control, and broader Discord resource access, which are common expectations for a Discord server.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
A paid remote MCP for AI agent browser DevTools MCP, built to return verdicts, receipts, usage logs,
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Discord using personal user tokens instead of bot applications, allowing for seamless message management and server exploration. It provides tools for reading history, sending messages, and searching across channels and DMs directly through MCP-compatible clients.9MIT
- AlicenseAqualityFmaintenanceEnables LLMs to read and send Discord messages, list servers and channels, and monitor unread messages via a selfbot that uses a user token (violates Discord ToS).8201MIT
- FlicenseAqualityDmaintenanceEnables LLMs to read messages, discover channels, send messages, and monitor Discord communities using web scraping without requiring bot permissions or API tokens.414-
- AlicenseNot gradedqualityBmaintenanceEnables MCP-compatible agents to securely control the user's already authenticated Chrome browser via explicit tab authorization and DOM-based actions.1Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mario-hernandez/discord-unofficial-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server