Skip to main content
Glama

discord-mcp

License: MIT Tests

An MCP server over the real Discord REST API -- so a Claude agent calls list_channels(guild_id="...") instead of hand-rolling an authenticated httpx request. Built to the github-mcp/bus-mcp standard in this portfolio (own pyproject, fastmcp server, typed errors, real test suite, honest README) -- fifth flagship, first over Discord.

5 read-only tools, always on + 7 write tools, gated OFF by default behind DISCORD_MCP_ENABLE_WRITE=1 -- see "Write tools" below.

Quickstart (60 seconds)

python -m venv .venv
.venv/Scripts/python.exe -m pip install -e ".[test]"

Add to your Claude Desktop/Code MCP config:

{
  "mcpServers": {
    "discord-mcp": {
      "command": "python",
      "args": ["C:/path/to/discord-mcp/run_server.py"],
      "env": { "DISCORD_BOT_TOKEN": "your-bot-token-here" }
    }
  }
}

Without DISCORD_BOT_TOKEN set, every tool call still returns a clean structured error (Discord's own 401) instead of crashing -- see "Typed errors" below. Write tools also need DISCORD_MCP_ENABLE_WRITE=1 in the same env block, or they refuse locally with policy_refusal -- see "Write tools" below.

Related MCP server: discord-bot-mcp

What this is / is not

This is a reference portfolio implementation demonstrating an MCP server over a real external SaaS API (Discord) -- it is NOT an official Discord MCP server, and it is not affiliated with Discord Inc. It started from an earlier, separate sibling project's HttpDiscordClient, a stdlib-urllib Discord transport built and verified against a real live guild for that project's own server-provisioning tooling. This repo hand-adapts that client's request-building, header construction (including its deliberately descriptive User-Agent -- see below), and error handling onto httpx (matching this fleet's other MCP servers) as its own standalone client with no dependency on that sibling project. discord-mcp does not import from or depend on that other package at all.

Started as 5 read-only tools with no write capability at all; now ships a 7-tool write group, off by default, mirroring the *_MCP_ENABLE_WRITE-style gate already shipped in github-mcp/bus-mcp/desktop-mcp in this same portfolio -- see "Write tools" below.

Tools

Read (always on, no gate)

Tool

Discord endpoint

Purpose

list_channels

GET /guilds/{guild_id}/channels

All channels (every type) in a guild

list_roles

GET /guilds/{guild_id}/roles

All roles in a guild

list_categories

GET /guilds/{guild_id}/channels (filtered)

Category channels only (Discord type 4) -- Discord has no dedicated categories-only endpoint, so this filters the same channels payload client-side

get_channel_permission_overwrites

GET /channels/{channel_id} (permission_overwrites field)

Role/member allow+deny bitfields set on one channel

get_member_roles

GET /guilds/{guild_id}/members/{member_id} (roles field)

Role ids currently assigned to one guild member

Write (gated behind DISCORD_MCP_ENABLE_WRITE=1, default OFF)

Tool

Discord endpoint

Purpose

create_channel

POST /guilds/{guild_id}/channels

Create a text/voice/category channel

edit_channel

PATCH /channels/{channel_id}

Rename/re-topic/re-parent/reorder an existing channel

create_role

POST /guilds/{guild_id}/roles

Create a role

edit_role

PATCH /guilds/{guild_id}/roles/{role_id}

Edit an existing role

edit_guild

PATCH /guilds/{guild_id}

Update guild-level identity (name/icon/banner/description)

delete_channel

DELETE /channels/{channel_id}

Destructive. Delete a channel

create_message

POST /channels/{channel_id}/messages

Post a message to a text channel (content: non-empty, <= 2000 chars)

Write tools

Seven write tools were added on top of the original 5 read-only tools, mirroring the exact write-gate pattern already shipped in this portfolio (github-mcp's GITHUB_MCP_ENABLE_WRITE, desktop-mcp's DESKTOP_MCP_ENABLE_*, and most closely bus-mcp's BUS_MCP_ENABLE_WRITE + gated_write decorator, copied as the reference template). create_message was added a night later than the other 6, once it became clear that none of create_channel/edit_channel/create_role/edit_role/edit_guild/delete_channel can actually post content to a channel -- it reuses the exact same gate and the post() helper create_channel/create_role already added to client.py, no new HTTP plumbing.

  • Off by default. Set DISCORD_MCP_ENABLE_WRITE=1 (or true/yes/on) in the server's environment to enable the write group. Unset (or any other value) means every write tool call refuses locally, with zero Discord API calls attempted, returning a structured policy_refusal error:

    {"ok": false, "error": {"type": "policy_refusal", "message": "Tool group 'write' is disabled. Set DISCORD_MCP_ENABLE_WRITE=1 in the server's environment to enable it.", "group": "write", "tool": "create_channel", "required_env": "DISCORD_MCP_ENABLE_WRITE"}}
  • Enforced at the route layer, not just the MCP-tool layer. The @config.gated_write decorator wraps each write function directly in discord_mcp/routes.py (not merely the @mcp.tool wrapper in server.py), so the gate is unit-testable without spinning up fastmcp or a real transport, and can't be bypassed by any alternate calling path into routes.py.

  • Read fresh from the environment on every call, never cached at import time -- an operator can arm/disarm the write group without restarting the server process, and tests can monkeypatch it per-test.

  • delete_channel gets no separate or lower bar. Despite being genuinely destructive/irreversible against a real guild, it is gated behind the exact same DISCORD_MCP_ENABLE_WRITE env var as the other write tools -- confirmed by dedicated tests in test_routes.py (setting plausible-but-wrong var names like DISCORD_MCP_ENABLE_DELETE does not arm it).

  • Same auth path as the read tools. Write calls reuse the exact same _headers()/pooled httpx.AsyncClient construction in client.py as every read tool -- there is only one auth code path in this repo.

  • create_message validates content locally, not just via Discord's own 400. content must be a non-empty string of at most 2000 characters (Discord's real message-length limit) -- checked by client.validate_message_content before any request is built, same "never even attempt the call" discipline as the snowflake-id checks. A violation returns validation_error, not a raw Discord 400.

icon_base64/banner_base64 on edit_guild -- a flagged assumption

Discord's docs describe PATCH /guilds/{id}'s icon/banner fields as an "image data" string -- a full data URI (data:image/png;base64,<base64>), not a bare base64 payload. edit_guild accepts either:

  • a full data:...;base64,... URI, passed through unchanged, or

  • raw base64 bytes, which are assumed to be PNG and wrapped as data:image/png;base64,<value>.

This PNG assumption is not verified against a real Discord response -- this repo has not confirmed whether Discord accepts, rejects, or silently mis-renders a non-PNG image (JPEG, animated GIF for boosted-server icons, etc.) sent under an image/png label. If you have a non-PNG image, pass a full data:image/...;base64,... URI yourself rather than relying on the default. Flagged here rather than guessed silently.

Typed errors, never a raw crash

Every tool returns {"ok": true, ...} on success or {"ok": false, "error": {...}} on failure -- never an unhandled exception or stack trace.

  • network_error -- connection refused, timeout, DNS failure, or a malformed request URL. Discord's API wasn't reachable at all.

  • auth_error (401) -- missing or invalid bot token.

  • permission_error (403, with Discord's own JSON error body, e.g. {"message": "Missing Access", "code": 50001}) -- the bot lacks the permission/scope for this call, or isn't in the guild.

  • cloudflare_blocked (403, with no JSON error body) -- Discord's API docs ask for a descriptive User-Agent; without one, a client's default UA is a well-known bot fingerprint that Discord's Cloudflare edge can reject with a bare 403 before the request ever reaches route-level permission checks. This is otherwise indistinguishable from a real permission_error 403 -- Discord's real permission-denied responses always carry a JSON body, so absence of a JSON body on a 403 is the signal this type is built on. This is a best-effort heuristic, not a certainty: a proxy, load balancer, or future Discord change that strips the body on a different kind of 403 would also land here. discord-mcp sends the same descriptive User-Agent this heuristic exists to explain (see client.py's _headers()), so in practice this type should rarely fire from this server's own calls -- see "Honest limitations" below.

  • not_found (404) -- bad/unknown guild, channel, role, or member id.

  • rate_limited (429) -- Discord's rate limit. Carries retry_after_s, parsed straight from Discord's own JSON body (retry_after, in seconds). This server does not auto-retry -- it surfaces the limit as a structured error immediately and leaves any backoff/retry decision to the caller.

  • decode_error -- a 2xx response whose body isn't valid JSON (should not happen against the real API; guards against a malformed proxy/mock).

  • discord_api_error -- any other 4xx/5xx not covered above.

  • policy_refusal (write tools only) -- the write group is disabled; see "Write tools" above. No Discord API call is attempted.

  • invalid_id -- a guild/channel/role/member id failed snowflake-shape validation before any request was built (defense against path injection).

  • validation_error (create_message only) -- content was empty or exceeded Discord's real 2000-character message limit, caught before any request was built.

Internally, discord_mcp/client.py raises typed DiscordUnreachable / DiscordApiError (with a DiscordDecodeError subclass for the 2xx-non-JSON case) exceptions; discord_mcp/routes.py catches both and normalizes to the dict shape above before a tool ever returns. Tests exercise both layers for every error type, across every HTTP verb (GET/POST/PATCH/DELETE).

Honest limitations

  • The cloudflare_blocked vs. permission_error split is a heuristic (JSON-body-present-or-not), not something Discord documents or guarantees. It is accurate for the specific failure mode it was written to explain (an edge reject due to a missing/generic User-Agent) but a 403 with a stripped body from an unrelated cause (e.g. a misbehaving proxy in between) would also be classified as cloudflare_blocked.

  • get_channel_permission_overwrites and get_member_roles were not exercised against every possible real-world edge case (e.g. a member with zero roles, a channel with zero overwrites) via the live smoke test -- only via respx-mocked unit tests. The live smoke test only calls list_channels/list_roles; it does not exercise any write tool.

  • No pagination is implemented anywhere. list_channels/list_roles are single-request, unpaginated Discord endpoints (Discord doesn't paginate either of these), so this is a non-issue for the tools in scope -- but a guild large enough to need member-list pagination is out of scope entirely (there is no list_members tool here).

  • The icon_base64/banner_base64 "assumed PNG" default on edit_guild has not been verified against a real Discord response -- see "Write tools" above.

  • No write tool has been exercised against the real Discord API at all (by design -- this task's constraints require zero real network calls; the live smoke test remains read-only-only). This includes create_message -- it has never posted a real message to a real live guild as part of this repo's own build/test process; that remains a deliberate, separate operator action.

Env vars

Var

Default

Purpose

DISCORD_BOT_TOKEN

unset

Bot token, sent as Authorization: Bot <token>. Read-only tools still work without one in the unit test suite (fully mocked); against the real API, a missing token surfaces as a normal auth_error (401) from Discord itself.

DISCORD_MCP_ENABLE_WRITE

unset (OFF)

Set to 1/true/yes/on to enable the 7 write tools. See "Write tools" above.

DISCORD_MCP_TIMEOUT_S

10.0

Per-request timeout (seconds)

DISCORD_MCP_LIVE

unset

Set to 1 to run the real-network smoke test (see Testing)

DISCORD_MCP_SMOKE_GUILD_ID

unset

Guild id the live smoke test targets. Test skips cleanly if unset.

DISCORD_MCP_SMOKE_ENV_PATH

unset

Path to an external .env file to source DISCORD_BOT_TOKEN from for the live smoke test, if not already in the environment.

DISCORD_API_BASE (https://discord.com/api/v10) is a fixed constant, not env-overridable -- unlike bus-mcp's self-hosted BUS_MCP_BASE_URL, Discord's REST API has exactly one real base URL.

Usage examples

Once connected in a Claude session, an agent can:

list_channels(guild_id="123456789012345678")
list_roles(guild_id="123456789012345678")
list_categories(guild_id="123456789012345678")
get_channel_permission_overwrites(channel_id="...")
get_member_roles(guild_id="123456789012345678", member_id="...")

With DISCORD_MCP_ENABLE_WRITE=1 set:

create_channel(guild_id="...", name="general", type=0)
edit_channel(channel_id="...", name="renamed", position=3)
create_role(guild_id="...", name="Mod", color=1752220, hoist=True)
edit_role(guild_id="...", role_id="...", name="Senior Mod", permissions="8")
edit_guild(guild_id="...", name="New Server Name")
delete_channel(channel_id="...")
create_message(channel_id="...", content="hello from discord-mcp")

Testing

.venv/Scripts/python.exe -m pytest -q

163 tests: 162 unit tests (respx-mocked, zero real network) + 1 live smoke (gated, see below). All 12 tools' happy paths are covered, every error type above is exercised at both the client layer (test_client.py) and the routes-normalization layer (test_routes.py), and test_server.py actually asyncio.run()s each @mcp.tool async wrapper function against a monkeypatched routes module -- not just introspects list_tools() -- so an arg-name mismatch or dropped kwarg between server.py and routes.py would be caught.

Write-tool coverage specifically (test_config.py + test_routes.py): gate-off refusal for each of the 7 write tools with len(respx.calls) == 0 asserted (proving no Discord call is even attempted), gate-on success paths with mocked Discord responses (including request-body assertions), gate-on Discord-API-error passthrough (permission/not-found/rate-limit/network/5xx), and delete_channel specifically double-checked -- both that it refuses identically to the other write tools, and that no plausible-but-wrong env var name (DISCORD_MCP_ENABLE_DELETE, etc.) accidentally arms it. create_message additionally gets dedicated content-length boundary tests (test_client.py/test_routes.py): exactly 2000 characters is accepted (1 respx call), 2001 characters and an empty string are both rejected locally as validation_error with zero respx calls.

Live smoke test

tests/test_live_smoke.py::test_live_list_channels_and_roles_against_a_real_guild is gated behind DISCORD_MCP_LIVE=1 and DISCORD_MCP_SMOKE_GUILD_ID (unset by default -- both must be set to run) and calls the real Discord API's list_channels/list_roles against that guild. It sources DISCORD_BOT_TOKEN from this process's own environment if already set, otherwise, if DISCORD_MCP_SMOKE_ENV_PATH points at an external .env file, loads it from there (once, without ever printing or logging the value) -- this repo has no .env of its own and never will; the real token lives in a separate operator-controlled location. It remains read-only-only -- no write tool has a live smoke test.

DISCORD_MCP_LIVE=1 DISCORD_MCP_SMOKE_GUILD_ID=<your-guild-id> \
DISCORD_MCP_SMOKE_ENV_PATH=<path-to-.env-with-token> \
.venv/Scripts/python.exe -m pytest tests/test_live_smoke.py -v

Verified passing against a real guild at the time of writing: real channels, roles, and categories all returned as non-empty lists.

Install / connect

python -m venv .venv
.venv/Scripts/python.exe -m pip install -e ".[test]"

Register in ~/.claude.json under mcpServers.discord-mcp as a stdio server invoking run_server.py by absolute path (no cwd needed -- the entrypoint adds its own directory to sys.path). env: {} in the real registration -- the real bot token is never baked into ~/.claude.json; set DISCORD_BOT_TOKEN in whatever process actually launches the server if you want authenticated calls, and DISCORD_MCP_ENABLE_WRITE=1 if you want the write group armed. Arming the write gate in the real registration is a deliberate, separate operator action -- not part of this repo's default config.

Handshake check

.venv/Scripts/python.exe scripts/list_tools.py

Prints the twelve registered tool names with no transport started -- pure introspection, useful for verifying the server wires up cleanly after any change.

Out of scope

  • Pagination / list_members (see "Honest limitations" above).

  • Retrying rate-limited (429) requests -- surfaced as a structured error, left to the caller.

  • Distinguishing every possible cause of a body-less 403 with certainty (see the cloudflare_blocked heuristic's honest limitation above).

  • Any write operation beyond the 7 tools above (e.g. member role assignment/kick/ban, message edit/delete, embeds/attachments/reactions, webhook management) -- create_message covers plain-text content only, no embeds/files/reactions. A broader, differently shaped write-capable project exists elsewhere in this author's portfolio with an apply_server_structure-style tool, out of scope here.

Commercial support

Maintained by Jaimen Bell. For production MCP integrations, custom servers, or agent-reliability work, see jaimenbell.dev.

Building your own MCP server? The MCP Starter Kit has templates, a build playbook, and packaging war-stories from shipping this one.

mcp-name: io.github.jaimenbell/discord-mcp

Available Tools

12 tools
create_channelA

[WRITE, gated behind DISCORD_MCP_ENABLE_WRITE=1] Create a channel (text/voice/category -- any Discord-valid type int) in a guild.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
typeYes
topicNo
guild_idYes
parent_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the WRITE nature and the DISCORD_MCP_ENABLE_WRITE gate, which is useful, but it omits details about required permissions, failure behavior, or side effects beyond creation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that packs the essential gate, verb, resource, and type flexibility without any fluff. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has moderate complexity with 5 parameters and no output schema description, but the existence of an output schema covers return values. The description lacks guidance on optional parameters and permission requirements, making it only minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 5 parameters with 0% description coverage. The description partially explains `type` (any Discord-valid int) and implies `guild_id` via 'in a guild', but it does not clarify `name`, `topic`, or `parent_id`, leaving most parameters unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a channel, a specific resource, and specifies the supported types (text/voice/category) via any Discord-valid `type` int. This distinguishes it from sibling tools like list_channels, edit_channel, and delete_channel.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates the tool is for creating channels, and the write gate provides a prerequisite context. However, it does not explicitly mention when not to use it or reference alternatives like edit_channel for modifications.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_messageA

[WRITE, gated behind DISCORD_MCP_ENABLE_WRITE=1] Post a message to a text channel. content must be a non-empty string of at most 2000 characters (Discord's real message content limit).

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It mentions the write nature and the gating condition, adding value beyond the tool name. However, it does not describe potential failure modes, rate limits, or side effects, leaving room for more transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the most critical information (write gate and action). Every part adds value, with no redundant or verbose content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter tool with an output schema, the description is nearly complete. It covers the purpose, a key usage constraint, and the access gate. It could mention prerequisites like valid channel ID, but that is largely implied, making it sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% coverage, so the description must compensate. It provides meaningful constraints for 'content' (non-empty, max length 2000) but does not explain 'channel_id' beyond its obvious name. Partial compensation, but one parameter remains implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('Post a message to a text channel') with a specific verb and resource. It is unambiguous and distinguishes itself from sibling tools, which are all channel/role management operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context, including the write gate (DISCORD_MCP_ENABLE_WRITE=1) and the content limit constraint. It does not explicitly mention alternatives or when not to use it, but given the sibling list, no alternative exists for sending messages, and the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_roleB

[WRITE, gated behind DISCORD_MCP_ENABLE_WRITE=1] Create a role in a guild.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
colorNo
hoistNo
guild_idYes
permissionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that this is a WRITE operation and gated behind an environment variable, which is useful. However, it lacks details about permissions needed, reversibility, or side effects of creating a role. The transparency is partial but not negligible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, extremely concise and front-loaded. It conveys the core action and gate without any waste. This is ideally sized for a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although the tool has 5 parameters (2 required) and no schema descriptions, the description provides none of that missing context. The output schema exists, so return value explanation is not needed, but parameter semantics and usage guidance are absent. For a write tool with zero schema coverage, this is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description adds no information about parameters. It does not explain the meaning of guild_id, name, color, hoist, or permissions beyond what the bare schema types show. The description fails to compensate for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Create a role in a guild.' This clearly states what the tool does and differentiates it from siblings like edit_role and create_channel. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions the gating environment variable '[WRITE, gated behind DISCORD_MCP_ENABLE_WRITE=1]', which provides some usage context (write operations require this flag). However, it does not explicitly tell when to use this tool versus alternatives like edit_role or list_roles, nor does it list any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_channelA

[WRITE, gated behind DISCORD_MCP_ENABLE_WRITE=1] Delete a channel. Genuinely destructive and irreversible against a real guild -- gated behind the exact same write gate as every other write tool, no separate/lower bar.

ParametersJSON Schema
NameRequiredDescriptionDefault
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It explicitly warns that the operation is 'genuinely destructive and irreversible' and explains the write-gate requirement (DISCORD_MCP_ENABLE_WRITE=1). This goes beyond the schema and provides critical safety context, though it does not detail failure modes or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence. It packs the essential information (what it does, the destructive nature, and the gating condition) without any redundant or tangential content. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one parameter), and an output schema exists, so return values need not be explained. The description covers the most critical contextual aspect—irreversibility—and the write gate requirement. However, it omits details like error cases or permission needs, which might be expected for a destructive write operation. Overall, it is adequate but not exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does not explicitly explain 'channel_id', but the tool name and phrase 'Delete a channel' make it clear the parameter identifies the channel to delete. For a single obvious parameter, this is minimally sufficient but adds no additional detail about format, constraints, or behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb and resource: 'Delete a channel.' It is distinct from sibling tools like create_channel and edit_channel, and no other sibling performs deletion, so there is no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (when you need to delete a channel) but provides no explicit when-to-use guidance or comparisons to alternatives. The warning about destructiveness is context but not usage direction. It does not mention exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_channelA

[WRITE, gated behind DISCORD_MCP_ENABLE_WRITE=1] Rename/re-topic/re-parent/reorder an existing channel. Only the fields explicitly passed are changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
topicNo
positionNo
parent_idNo
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the write nature, the gating condition, and partial-update behavior, which is valuable. But it omits permission requirements, potential side effects on channel ordering, and reversibility, leaving gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, front-loaded with the WRITE flag, and every word adds value. There is zero fluff, and it conveys core behavior efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter tool, the description gives a high-level overview and notes partial updates, which is helpful. With an output schema present, return details are not needed. However, missing parameter constraints and prerequisites make it only minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It maps actions to fields (rename->name, re-topic->topic, re-parent->parent_id, reorder->position) but does not explain constraints like position semantics, parent_id validity, or name rules. This is only partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Rename/re-topic/re-parent/reorder an existing channel' clearly states the tool's verb+resource and specific operations. It distinguishes from siblings like create_channel, delete_channel, edit_role, and edit_guild by focusing on editing existing channels.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implied usage is clear ('existing channel', 'only fields explicitly passed are changed'), and the WRITE gate provides a conditional prerequisite. However, there's no explicit comparison to alternatives or exclusions, leaving the agent to infer when to choose this over other edit/create tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_guildA

[WRITE, gated behind DISCORD_MCP_ENABLE_WRITE=1] Update guild-level identity (name/icon/banner/description). icon_base64/banner_base64 are base64-encoded image bytes (assumed PNG unless already a full data: URI) -- see README's honest-limitations section.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
guild_idYes
descriptionNo
icon_base64No
banner_base64No

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It explicitly labels the operation as [WRITE] and reveals the gating behind an environment variable. It also explains the image format expectations for icon_base64/banner_base64 and points to the README for limitations. This goes beyond a bare description, though it does not cover all side effects or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact—two sentences—and front-loads the critical WRITE designator and gating condition. Every word adds information, with no fluff. The inline formatting of base64 parameters is clear and concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema and 5 parameters, but no annotations. The description covers the core purpose, the write gate, and the image format nuance. It omits details like merge semantics (e.g., whether null leaves a field unchanged) and does not explicitly state return values, though the output schema may cover that. Overall, it is sufficiently complete for a typical use, with a pointer to the README for deeper limitations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It names the updatable fields (name/icon/banner/description) and explains the format of icon_base64/banner_base64 in detail. However, it does not describe the remaining parameters (guild_id, name, description) in a way that adds value beyond their names. The key ambiguous parameters are covered, but the others rely on self-explanatory names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Update guild-level identity (name/icon/banner/description).' The verb 'Update' and the resource 'guild-level identity' are specific and distinguish it from sibling tools like edit_channel and edit_role. It leaves no ambiguity about what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool (for guild-level settings, not channel/role edits) but does not explicitly name alternatives or state when not to use it. The mention of the write gate (DISCORD_MCP_ENABLE_WRITE=1) adds context about availability, but there is no direct comparison to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_roleA

[WRITE, gated behind DISCORD_MCP_ENABLE_WRITE=1] Edit an existing role. Only the fields explicitly passed are changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
colorNo
hoistNo
role_idYes
guild_idYes
permissionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the transparency burden. It explicitly discloses that this is a write operation, gated behind an environment variable, and that only fields explicitly passed are changed (partial update). This adds important behavioral context beyond what the schema alone provides, though it doesn't discuss permission requirements or failure scenarios.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence with a leading gate indicator. It is front-loaded with the write warning and immediately states the operation and update semantics. Every word earns its place with no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values need not be described. The description covers the core behavior (edit existing role, partial update) and the write gating. It doesn't mention required IDs, but those are in the schema. Overall, it's sufficient for an agent to understand the tool's primary contract, though a bit more context about the role being modified would push it to 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds the key semantic that only explicitly passed fields are modified, implying nullable parameters mean 'no change'. However, it doesn't explain individual parameters; while names like 'name' and 'color' are self-explanatory, 'permissions' as a string could be ambiguous without additional context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Edit an existing role' which is a specific verb+resource pair. It clearly distinguishes this from create_role by specifying 'existing' and from edit_channel by targeting roles. The scope is clear and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for modifying existing roles, not creating new ones, and notes it is gated behind DISCORD_MCP_ENABLE_WRITE=1. It doesn't explicitly name alternatives, but the phrasing 'existing role' combined with sibling tool names like create_role makes the appropriate context evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_channel_permission_overwritesA

Get the permission overwrites (role/member allow+deny bitfields) set on a single channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the transparency burden. It explains the data returned (allow+deny bitfields) and implies a read-only operation via 'Get', but does not explicitly state side-effect-free behavior, required permissions, or output format. The added bitfield context is useful but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly-written sentence that front-loads the verb and resource. Every phrase earns its place, explaining both what is retrieved and the structure of the data (bitfields). No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter getter with an output schema present, the description adequately covers the tool's purpose. It mentions the key data structure (allow+deny bitfields) and implies the input. It is slightly incomplete in not explaining parameter specifics, but the output schema covers return details, and the tool's simplicity keeps it sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not elaborate on the channel_id parameter beyond implying it identifies a channel. It does not specify it's a snowflake ID, any format constraints, or how to obtain it. The description adds minimal value over the raw schema, leaving an agent to infer the parameter's exact semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the specific resource 'permission overwrites' with scope 'set on a single channel'. It distinguishes itself from siblings like list_channels or get_member_roles by focusing on overwrites for a channel, and adds clarity with 'role/member allow+deny bitfields'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: when you need the permission overwrites of a specific channel. It does not explicitly name alternatives or exclusions, but the purpose is specific enough that an agent can infer appropriate usage. No direct mention of when-not-to-use lowers it from a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_member_rolesA

Get the role ids currently assigned to one guild member.

ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idYes
member_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description mentions 'currently assigned', which suggests it returns the live state of role assignments. Since there are no annotations, the description carries the burden, but it does not explicitly state that this is a read-only operation, nor does it disclose any permissions required or error behavior (e.g., what happens if the member is not found). The 'get' verb implies no side effects, and the specification of 'role ids' clarifies the return type, so it is minimally transparent but lacks deeper behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no unnecessary words. Every word contributes meaning: 'Get' indicates the action, 'role ids' specifies the output, 'currently assigned' adds temporal context, and 'one guild member' clarifies scope. It is appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two clear parameters and an output schema, the description covers the core purpose. However, it lacks any guidance on usage relative to sibling tools (e.g., list_roles) and omits any mention of permissions or error handling. Since no annotations are present, the description alone is only partially complete; it tells what the tool does but not enough about when or under what conditions to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no descriptions for guild_id or member_id (0% coverage). The description does not elaborate on these parameters, leaving the agent to infer their meanings from the parameter names alone. While the names are self-explanatory, the description does not add value beyond the schema, and with no coverage, it fails to compensate. No information about formats, constraints, or relationships is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and the resource ('role ids currently assigned to one guild member'). It is specific about scope ('one guild member'), distinguishing it from sibling tools like list_roles (which likely lists all roles in a guild) and list_channels. The verb and target are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: if you need the role IDs of a specific member, this is the tool. However, it provides no explicit guidance on when to prefer this over alternatives like list_roles, nor does it mention any prerequisites or context. No exclusions or alternatives are named, so it relies on the reader to infer 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.

list_categoriesA

List only the category channels (Discord channel type 4) in a guild -- filtered client-side, since Discord has no dedicated categories-only endpoint.

ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. It discloses a key behavioral trait: filtering is done client-side because Discord has no categories-only endpoint. This gives the agent useful context about potential performance/implementation characteristics, though it doesn't detail return format or rate limits (output schema covers return).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly written sentence that front-loads the primary action ('List only the category channels') and adds essential context. Every word contributes value, with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, an output schema is present to define return values. The description covers the purpose, scope (category channels), and the key implementation detail (client-side filtering). No critical information is missing for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter, guild_id, is not described in the schema (0% coverage). The description only mentions 'in a guild', which implicitly refers to the guild_id but does not explicitly explain the parameter's format or role. Since the parameter name is self-explanatory, this is adequate but not thorough.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists only category channels (Discord channel type 4) in a guild, using a specific verb and resource. It distinguishes itself from sibling tools like list_channels by explicitly scoping to categories only and noting the client-side filtering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: when you need only category channels. It also explains the lack of a dedicated Discord endpoint, which justifies the tool's existence. However, it doesn't explicitly state when not to use it or mention alternatives like list_channels for all channels.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_channelsA

List all channels (every type, including categories and voice channels) in a Discord guild.

ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It implies a read-only operation by stating 'list', but does not explicitly disclose non-destructive behavior, authentication needs, or rate limits. For a simple list tool, this is adequate but not enhanced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence that is clear, front-loaded with the main purpose, and contains no unnecessary words. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 parameter, output schema exists), the description is nearly complete. It could mention behavior when no channels exist or pagination, but these are minor omissions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'guild_id' is not described in the schema (0% coverage), but the description explains it by stating the tool lists channels 'in a Discord guild', effectively clarifying the parameter's role. The description compensates well for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action (list), resource (all channels including categories and voice channels), and context (Discord guild). It's specific and distinguishes the tool from potential alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description implies usage context (Discord guild) but does not provide explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives. Since no sibling tools are listed, the lack of exclusions is acceptable but still minimal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_rolesB

List all roles in a Discord guild.

ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, but it only restates the action in slightly more detail. It does not mention required permissions, potential side effects, ordering, inclusions (e.g., @everyone), or any other behavioral traits beyond the name itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that immediately states the action and scope. Every word adds value, and there is no redundant or extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one parameter and an output schema, the description is minimally adequate, but it lacks usage guidance and behavioral details such as permission requirements or context about what 'all roles' includes. The output schema likely explains the return shape, so that omission is acceptable, but the absence of usage context prevents a higher score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage for guild_id, leaving the description to compensate. The phrase 'in a Discord guild' implies that guild_id identifies the guild, but it does not add any format, validation, or usage detail beyond what the parameter name already suggests. For a single obvious parameter, the description provides minimal but sufficient semantic support.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('all roles in a Discord guild'), clearly distinguishing it from sibling tools like list_channels, list_categories, and get_member_roles. The scope is explicit ('all roles') and the target container is specified ('a Discord guild').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use list_roles versus alternatives such as get_member_roles or list_channels. While the purpose is implicit from the name and context, there is no explicit context, exclusion, or mention of alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A3.9/5.0
Disambiguation4/5

Most tools target distinct resources and actions, but list_channels and list_categories overlap as the latter is a filtered subset of the former. get_member_roles and list_roles could also be mildly confused, though descriptions clarify scope.

Naming Consistency5/5

Consistent verb_noun pattern: list_* for collections, get_* for specific sub-resources, create_/edit_/delete_ for mutations. All snake_case with predictable naming.

Tool Count5/5

12 tools is a well-scoped set for a Discord guild management server, fitting the 3-15 range.

Completeness3/5

Core channel lifecycle is covered (list/create/edit/delete) plus role create/edit, but delete_role is missing and there's no way to assign roles to members or edit permission overwrites, creating notable gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    C
    quality
    C
    maintenance
    An MCP server that exposes Discord bot actions as tools for LLM clients.
    29
    1
  • A
    license
    B
    quality
    B
    maintenance
    A local MCP server that lets AI clients control a Discord bot via Discord's REST API, offering messaging, administration, and moderation tools. Includes safety features such as guild scoping, allowlists, and opt-in write permissions.
    20
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP 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.
    6
    3
    MIT

Latest Blog Posts

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/jaimenbell/discord-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server