Skip to main content
Glama
lburnscissp

discord-mcp

by lburnscissp

discord-mcp

tests Python 3.12+ MIT licence

An MCP server that lets Claude — or any MCP client — operate a Discord bot. Read channels, search history, post and reply, manage channels, threads and roles, moderate members, and read the audit log.

35 tools. Python 3.12+, no framework beyond the MCP SDK and httpx. Runs as a local subprocess of your client, holds no state, and makes plain HTTPS calls to Discord's REST API v10 — no gateway connection, nothing running in the background.

You:    "What's been discussed in #trading-ideas this week?"
Claude: [discord_read_messages] → summarises the last 40 messages
You:    "Reply to Sam's question about position sizing."
Claude: [discord_send_message] → posts as your bot, mentions suppressed by default

What it can and can't do

Can: anything the bot's role is permitted to do, in any server the bot has been invited to. One running server handles as many Discords as the bot is in.

Can't, and these are not bugs:

Why

See a server the bot isn't in

Discord has no such thing. Someone with Manage Server has to add the bot. There is no way in from outside.

Act as you

It acts as the bot, with the bot's name and avatar. Automating a human account ("self-botting") breaks Discord's ToS and gets accounts banned — don't ask it to, it can't.

React to events live

No gateway connection, by design. It answers questions; it isn't notified of new messages. See architecture.md.

Use Discord's message search

That endpoint is user-accounts-only. discord_search_messages pages back through history and filters locally instead.

Read message text without the intent

Message Content is a privileged intent. Switch it on or every message comes back blank — see step 3 of Setup.

Related MCP server: mcp-discord

Setup

Four steps, about five minutes. Step 1 is the one people get wrong.

1. Create the bot

  1. Go to https://discord.com/developers/applications → New Application → give it a name (this becomes the bot's display name).

  2. Bot tab → Reset Token → copy it somewhere safe. Discord shows it once. If you lose it, reset again — resetting invalidates the old one.

  3. Still on the Bot tab, scroll to Privileged Gateway Intents and enable:

    • Message Content Intent — required. Without it, every message's text arrives as an empty string, with no error. This catches almost everyone.

    • Server Members Intent — only needed for discord_list_members. Member search works without it.

    Click Save Changes.

2. Invite it to your server

OAuth2 tab → copy your Client ID (also shown as Application ID on the General Information tab), then open one of these URLs with CLIENT_ID replaced:

Everything the tools need — read, post, manage channels and roles, moderate:

https://discord.com/oauth2/authorize?client_id=CLIENT_ID&scope=bot&permissions=1494917180630

Read and post only — no moderation, no channel or role management. A sensible place to start:

https://discord.com/oauth2/authorize?client_id=CLIENT_ID&scope=bot&permissions=274878024896

Read only — view channels, read history, read the audit log:

https://discord.com/oauth2/authorize?client_id=CLIENT_ID&scope=bot&permissions=66688

Open the URL, choose your server, authorise. The bot appears in the member list, offline — that's correct, it has no gateway connection.

You can widen permissions later in Server Settings → Roles without re-inviting. If you prefer to pick by hand, the OAuth2 URL Generator on that tab builds the URL for you.

3. Install and configure

git clone https://github.com/lburnscissp/discord-mcp.git
cd discord-mcp
uv sync
cp .env.example .env

Put your token in .env:

DISCORD_BOT_TOKEN=your-token-here
# Optional: a default server, so tools don't need guild_id every call
DISCORD_GUILD_ID=

To get a server ID: Discord → User Settings → Advanced → Developer Mode on, then right-click the server icon → Copy Server ID. Leaving it blank is fine — see Using it with several servers.

Check it works, with no network calls and no token needed:

uv run pytest

(No uv? pip install -e ".[dev]" in a 3.12+ virtualenv does the same job; replace uv run with your venv's python below.)

4. Register with your MCP client

Claude Code:

claude mcp add discord -- uv --directory "$(pwd)" run discord-mcp

Claude Desktop — add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):

{
  "mcpServers": {
    "discord": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/discord-mcp", "run", "discord-mcp"]
    }
  }
}

Restart the client, then ask it: "discord whoami". You should get the bot's name back. Then "list my discord channels".

Tools

Read tools take response_format: markdown (default, compact and readable) or json (full structured data). Tools that change a server take reason, which Discord records in the audit log. Every tool is annotated read-only / destructive so your client can decide what to confirm.

Servers

Tool

discord_whoami

Identify the bot. The cheapest check that your token works.

discord_list_guilds

Every server the bot is in. Where you find a guild_id.

discord_get_guild

Name, owner, member and online counts, creation date.

Channels and threads

Tool

discord_list_channels

Channels and categories, filterable by kind or name. Where you find a channel_id.

discord_get_channel

One channel or thread in detail.

discord_create_channel

New channel or category. Needs Manage Channels.

discord_edit_channel

Rename, retopic, move, set slowmode; archive or lock a thread.

discord_delete_channel

Destructive. Deletes the channel and all its messages.

discord_list_threads

Active (unarchived) threads.

discord_create_thread

From a message, or standalone.

Messages

Tool

discord_read_messages

Recent messages with cursor pagination.

discord_get_message

One message, with attachments, embeds and reactions.

discord_search_messages

Find a phrase in a channel's recent history, optionally by author.

discord_send_message

Post or reply. Mentions suppressed unless allow_mentions=true.

discord_edit_message

Edit a message the bot sent (Discord won't let bots edit others').

discord_delete_message

Destructive. One message.

discord_react

Add or remove the bot's reaction.

discord_list_pins

Pinned messages.

discord_pin_message

Pin or unpin.

discord_send_dm

Direct message a user.

Members

Tool

discord_search_members

Prefix search on username or nickname. Turns a name into an ID.

discord_list_members

Full member list. Needs the Server Members intent.

discord_get_member

Nickname, roles, join date, timeout status.

discord_set_member_role

Add or remove a role.

Roles

Tool

discord_list_roles

All roles, highest first, with IDs and permission bitfields.

discord_create_role

New role, with colour and permissions.

discord_edit_role

Change name, colour, flags or permissions.

discord_delete_role

Destructive. Removes it from every member.

Moderation

Tool

discord_timeout_member

Mute for up to 28 days. minutes=0 lifts it.

discord_kick_member

Destructive. Removes them; they can rejoin with an invite.

discord_ban_member

Destructive. Blocks rejoining; can delete their recent messages.

discord_unban_member

Lift a ban.

discord_list_bans

Who's banned, and the reason recorded.

discord_bulk_delete_messages

Destructive. 2–100 messages at once, under 14 days old.

discord_get_audit_log

Who did what, and why. Answers "who deleted that channel?"

Using it with several servers

Every server-scoped tool takes an optional guild_id. The resolution order is simple:

  1. the guild_id you pass, if you pass one;

  2. otherwise DISCORD_GUILD_ID from .env;

  3. otherwise an error telling you to run discord_list_guilds.

So one installation covers every server the bot is in. Set DISCORD_GUILD_ID to whichever you use most and it becomes the default — "post this in #general" needs no ID — while "list the channels in my other server, ID 123…" still works. Leave it unset if you treat several equally; the client will pass the ID each time.

Running several bots (different identities, different servers) means registering the server twice with different .env files — or two clones. The process reads its token at startup.

Troubleshooting

Symptom

Cause and fix

Error: Invalid bot token

Wrong or stale token. Reset it in the portal (Bot → Reset Token) and update .env. Note it's the bot token, not the client secret.

Error: DISCORD_BOT_TOKEN is not set

No .env, or the file is somewhere else. It must sit next to pyproject.toml. The server walks up from its own location to find it — the client's working directory doesn't matter.

Every message's text is empty

Message Content Intent is off — Discord blanks text, attachments and embeds together, with no error. Portal → Bot → Privileged Gateway Intents → enable → Save Changes. Takes effect on the next call; no re-invite needed. The read tools say so when they spot it.

Messages shown as (system: joined the server)

Not an error — those are Discord's own join/pin/boost notices, which never have text. Real messages appear alongside them.

Error: Missing access (50001)

The bot isn't in that server, or can't see that channel. Check channel-level permission overrides, not just the role.

Error: Missing permissions (50013)

The role lacks the permission. For role changes, also check hierarchy: a bot can't touch a role positioned above its own. Drag its role higher in Server Settings → Roles.

Error: Missing access on discord_list_members

Server Members Intent is off. Or use discord_search_members, which doesn't need it.

Bulk delete fails

Messages older than 14 days — Discord's limit, not ours. Delete them individually.

Bot shows as offline

Expected. No gateway connection; it works over HTTP.

Tools don't appear in the client

Check the client's MCP logs. Run uv run discord-mcp -v by hand — it should sit there silently waiting for input on stdin.

Deeper debugging:

uv run discord-mcp -v                                            # verbose logs on stderr
npx @modelcontextprotocol/inspector uv --directory . run discord-mcp   # poke tools by hand
uv run discord-mcp --http --port 8765                            # HTTP instead of stdio

Security

  • The token is the whole bot. Anyone holding it can do everything the bot can, in every server it's in. .env is git-ignored; *.key, *.pem, *credentials* and *secrets* are too. Never paste it into an issue, a chat, or a commit.

  • If a token leaks, reset it. Deleting the file isn't enough — a committed secret stays in git history. Portal → Bot → Reset Token invalidates the old one immediately.

  • Give the bot the narrowest permissions you can live with. Start with the read-only or read-and-post invite above; widen later in Server Settings when something fails.

  • Mentions are suppressed by default so model-generated text can't accidentally @everyone. Overriding that is explicit (allow_mentions=true).

  • The HTTP transport binds to 127.0.0.1 only — this process holds a token and must not be reachable from your network.

  • Destructive tools are annotated so your client can require confirmation. Treat that as UX, not a security boundary: a client is free to ignore annotations, so don't give the bot Ban Members in a server where a wrong call would be a disaster.

Project layout

src/discord_mcp/
  client.py       every HTTP call: auth, 429 retry, Discord errors → actionable messages
  formatting.py   snowflake timestamps, Markdown/JSON renderers, pagination envelopes
  server.py       entry point: stdio (default) or --http
  tools/
    _common.py    shared server instance, argument types, annotations — read this first
    guilds.py channels.py messages.py members.py roles.py moderation.py
tests/            34 tests, Discord mocked with respx, no token required
docs/             architecture.md, adding-a-tool.md

Every module opens with a docstring explaining the Discord behaviour it's built around. docs/architecture.md is the guided tour.

Licence

MIT. Not affiliated with or endorsed by Discord.

Available Tools

35 tools
discord_ban_memberA
Destructive

Ban a user from the server (they cannot rejoin until unbanned), optionally deleting their recent messages.

Needs Ban Members. Confirm with the user before calling.

Returns: Confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason recorded in the server's audit log.
user_idYes
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
delete_message_daysNoAlso delete this user's messages from the last N days (0–7).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely new context: the ban persists until explicitly lifted, the required permission scope, and a mandatory user-confirmation step. It does not state whether a reason is required or what happens when the target is not currently a member.

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

Conciseness4/5

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

Three short, front-loaded lines with no filler; the effect statement comes first and the precondition second. 'Returns: Confirmation.' is largely redundant given an output schema exists, costing it the top score.

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 destructive moderation tool, the description covers effect, permission requirement, and confirmation policy, and the output schema handles the return value. Missing edge cases (target not in server, interaction with existing bans, audit-log reason requirements) are minor against the annotation coverage.

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 75%, with reason, guild_id, and delete_message_days all already described in the schema itself. The description's 'optionally deleting their recent messages' merely restates delete_message_days without adding format, default, or range detail, so the baseline of 3 applies.

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?

States a specific verb (Ban) and resource (user from the server), and the parenthetical clarifies the durable effect ('cannot rejoin until unbanned'), which distinguishes it from kick_member and timeout_member in the sibling set.

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?

Gives concrete prerequisites and a procedural rule: 'Needs Ban Members' and 'Confirm with the user before calling.' It stops short of explicitly naming alternatives (kick/timeout/unban) and when to prefer them, so routing between the sibling moderation tools still requires inference.

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

discord_bulk_delete_messagesA
Destructive

Delete 2–100 messages from one channel in a single call. Irreversible. Needs Manage Messages.

Discord refuses messages older than 14 days — delete those one at a time with
discord_delete_message. Confirm with the user before calling.

Returns: Confirmation with the count deleted.
ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason recorded in the server's audit log.
channel_idYes
message_idsYes2–100 message IDs, all younger than 14 days.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is partly covered. The description still adds non-obvious behavior: irreversibility, the Manage Messages permission requirement, and Discord's 14-day refusal rule — genuinely useful context beyond the structured fields, though it doesn't cover audit-log semantics or partial-failure handling.

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?

Four short, front-loaded sentences: action and irreversibility first, then the platform limit and the alternative, then the confirmation guardrail, then the return shape. No sentence is padded.

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?

For a destructive bulk-mutation tool with an output schema present, the description covers the action, limits, permission requirement, required user confirmation, fallback tool, and return summary. Nothing an agent needs to call it correctly is missing.

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?

Schema coverage is 67% and the uncovered channel_id has no description in either place. The description compensates by reinforcing that all message_ids must live in one channel and be under 14 days old, and that the count is bounded at 2–100 — adding constraint meaning beyond the raw schema.

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?

States a specific verb (Delete), resource (messages), and scope (2–100, single channel) in one call. It clearly distinguishes itself from the sibling discord_delete_message by specifying the bulk range, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Explicitly names the when-not case: messages older than 14 days must be deleted one at a time with discord_delete_message, naming the alternative. It also adds a procedural guardrail ('Confirm with the user before calling'), which is actionable usage guidance rather than vague advice.

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

discord_create_channelA

Create a channel or category in a server. Needs the Manage Channels permission.

Returns: Confirmation with the new channel's label and ID.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDiscord lowercases and hyphenates text channel names.
nsfwNo
typeNoChannel kind.text
topicNoChannel topic (text channels only).
reasonNoReason recorded in the server's audit log.
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
parent_idNoCategory ID to place the channel under.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description adds the permission requirement and confirms a mutation with a return value, but doesn't disclose non-idempotency or destruction scope. With annotations covering the safety profile, the added value is modest.

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

Conciseness4/5

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

Very concise and front-loaded: the core action is stated first, then the permission requirement, then the return value. Two sentences with no waste, though the return-value line is a bit redundant given an output schema exists.

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 7-parameter mutation tool with no annotations covering permissions, the description could say more about required Discord permissions, the effect of each type value, or how the channel placement works. With an output schema present, the return description is unnecessary. Adequate but not 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?

Schema coverage is 86% – the schema already documents all 7 parameters, including the enum for 'type' and descriptions for name, topic, reason, guild_id, parent_id. The description adds no parameter-level details beyond what the schema provides, so baseline 3 is appropriate.

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?

States a specific verb+resource: 'Create a channel or category in a server.' This clearly distinguishes it from siblings like discord_edit_channel or discord_delete_channel, which are non-create operations on the same resource.

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?

Names the required permission (Manage Channels) but offers no when/when-not guidance or references to alternatives. For instance, it doesn't say to use discord_create_thread instead for forum-like threads, nor when to create a category vs. a channel. Implied usage only.

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

discord_create_roleA

Create a role. Needs Manage Roles. New roles appear at the bottom of the hierarchy.

Returns: Confirmation with the role ID.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
colorNoHex color like '#5865F2'.
hoistNoShow members with this role separately in the sidebar.
reasonNoReason recorded in the server's audit log.
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
mentionableNoLet anyone @mention the role.
permissionsNoPermission bitfield as a decimal string, e.g. '8' for Administrator.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations cover the safety profile (not read-only, not destructive, not idempotent, open-world), and the description adds value beyond them: the Manage Roles authorization requirement and the behavioral note that new roles land at the bottom of the hierarchy. It doesn't cover error cases such as hitting the role limit, so it stops short of 5.

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

Conciseness4/5

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

Three short, front-loaded sentences with no padding; purpose comes first, then prerequisites, then hierarchy behavior. The 'Returns: Confirmation with the role ID' line is mildly redundant given an output schema exists, keeping it from a 5.

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?

With an output schema and annotations present, the description is complete enough: purpose, auth requirement, and a key behavioral trait are all stated. Minor gaps remain around failure modes (permission errors, role limits) for a 7-parameter mutation tool.

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 86%, so the schema already documents the parameters (color format, hoist, mentionable, permissions bitfield, guild_id fallback). The description adds no parameter detail, making the baseline 3 appropriate.

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

Purpose4/5

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

States a specific verb+resource ('Create a role') that inherently separates it from discord_edit_role, discord_delete_role, and discord_list_roles. It stops short of naming a sibling explicitly, so it's clear but not maximally differentiated.

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?

'Needs Manage Roles' gives a permission prerequisite, which is genuine usage context, but there is no explicit when-to-use, when-not-to-use, or routing to alternatives like discord_edit_role for later changes. Usage is only implied.

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

discord_create_threadA

Start a thread — from an existing message, or standalone in a channel.

Returns: Confirmation with the thread ID. Post into it with discord_send_message using
the thread ID as channel_id.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
reasonNoReason recorded in the server's audit log.
privateNoStandalone threads only: make it invite-only.
channel_idYesText/announcement channel to create the thread in.
message_idNoStart the thread from this message. Omit for a standalone thread.
auto_archive_minutesNoAuto-archive after this much inactivity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, and idempotentHint=false, so the safety profile is clear. The description adds valuable context: the return value (thread ID) and the follow-up action (use discord_send_message with the thread ID as channel_id). It does not mention rate limits or permission requirements, but the core behavioral guidance is present and useful.

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?

Two short sentences front-loaded with the core action, followed by the return value and next-step guidance. Every sentence earns its place with no redundancy.

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 tool with 6 parameters, 83% schema coverage, and an output schema, the description covers the purpose, the two modes, the return value, and the integration with discord_send_message. It is nearly complete. A minor gap is the absence of permission requirements or rate-limit notes, but given annotations and output schema, this is a strong definition.

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 83%, so most parameters are already documented in the schema. The description does not elaborate on any parameter beyond noting the two modes, which aligns with the schema's message_id description. Baseline 3 is appropriate when schema does the heavy lifting and the description adds no extra parameter details.

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?

States a specific verb (Start) and resource (thread), and explicitly covers the two modes: from an existing message or standalone in a channel. This distinguishes it clearly from siblings like discord_send_message or discord_create_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 clarifies the two creation modes (message-based vs standalone), which is the key usage decision. It also tells the agent how to post into the new thread (discord_send_message with thread ID as channel_id). However, it does not mention when to use this versus discord_list_threads or discord_create_channel explicitly, nor does it state prerequisites like permissions.

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

discord_delete_channelA
Destructive

Permanently delete a channel or thread and every message in it. Irreversible.

Confirm with the user before calling. Needs Manage Channels.

Returns: Confirmation naming what was deleted.
ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason recorded in the server's audit log.
channel_idYesChannel or thread ID to delete. Cannot be undone.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, so the description earns credit for additive context: it discloses the cascade effect ('every message in it'), irreversibility, the required permission (Manage Channels), and a confirmation requirement. It stops short of 5 only because 'Irreversible' partially echoes the destructive annotation.

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?

Four short, front-loaded sentences: action, irreversibility, prerequisite/confirmation, and return. Zero filler and every sentence carries operational weight.

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?

For a destructive single-target mutation with full annotations and an output schema, the description covers the essentials an agent needs: what is destroyed, irreversibility, permission, and confirmation. Return-value detail is safely delegated to the output schema.

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 100% – channel_id documents the pattern and irreversibility, and reason documents its audit-log purpose. The description adds nothing about parameter usage, so the baseline 3 applies.

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?

States a specific verb and resource ('Permanently delete a channel or thread') and clarifies scope with 'every message in it', which sharply distinguishes it from siblings like discord_delete_message or discord_delete_role. An agent can select it without opening the schema.

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?

Gives explicit pre-call guidance ('Confirm with the user before calling') and a permission prerequisite ('Needs Manage Channels'), which is clear context for when the tool is appropriate. It does not name alternative tools (e.g., discord_edit_channel) for non-destructive edits, so it stops short of full alternative routing.

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

discord_delete_messageA
Destructive

Delete one message. Deleting others' messages needs Manage Messages. Irreversible.

For 2–100 recent messages at once use discord_bulk_delete_messages.

Returns: Confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason recorded in the server's audit log.
channel_idYesChannel, thread, or DM channel ID.
message_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, non-idempotent, and open-world. The description adds the critical 'Irreversible' warning and the permission nuance, both valuable. But with annotations carrying the safety profile, and the description adding only irreversibility and permissions, a 3 is appropriate – more detail on audit log or recoverability would raise it.

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?

Two short sentences plus a return note. Every clause carries information: scope, permission, irreversibility, and sibling routing. Front-loaded and zero 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?

Output schema exists, so return values needn't be explained; the 'Returns: Confirmation' suffices. Description covers scope, permissions, and irreversibility. Missing only audit-log/reason behavior, which is minor given the schema documents 'reason'.

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 67%. The description doesn't mention any parameters by name; the schema documents channel_id, message_id, and reason. The description adds no parameter-level meaning, which is acceptable at baseline 3 when schema does substantial work, but it doesn't compensate for the remaining uncovered parameter.

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?

Specific verb+resource ('Delete one message') and explicitly distinguishes scope from the sibling discord_bulk_delete_messages by stating the bulk range (2-100). An agent can immediately tell this is the single-message deletion tool.

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?

Explicitly routes bulk operations to discord_bulk_delete_messages and notes the permission requirement (Manage Messages) for others' messages. Doesn't state when-not-to-use beyond the bulk case, but the context is clear.

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

discord_delete_roleA
Destructive

Delete a role, removing it from every member. Irreversible — confirm with the user first.

Returns: Confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason recorded in the server's audit log.
role_idYes
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the bar is lower. The description adds concrete value beyond them by stating the blast radius (removed from every member) and the irreversibility/confirmation requirement, though it says nothing about audit-log reasoning or permission needs.

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

Conciseness4/5

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

Two short, front-loaded statements with no filler; the destruction scope leads and the caution follows. The trailing 'Returns: Confirmation.' is slightly redundant given an output schema exists.

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 destructive mutation with annotations covering the safety profile and an output schema covering the return value, the description supplies the key missing behavioral context (scope + irreversibility). Only minor gaps remain, such as permission prerequisites.

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 67%, with 'reason' and 'guild_id' documented in the schema while 'role_id' is only implied by its name and pattern. The description adds no parameter syntax or format detail, so baseline 3 applies when the schema carries most of the load.

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?

States a specific verb+resource ('Delete a role') and clarifies scope ('removing it from every member'), which distinguishes it from edit_role, create_role, and set_member_role among the siblings.

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?

Provides a clear precondition: 'Irreversible — confirm with the user first,' which is actionable guidance for an agent. It does not, however, name alternatives (e.g., edit_role to modify rather than delete), so the routing guidance is incomplete.

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

discord_edit_channelA
Idempotent

Rename, retopic, move, set slowmode on a channel — or archive/lock a thread.

Only the fields you pass are changed. Needs Manage Channels (Manage Threads for threads).

Returns: Confirmation listing the fields changed.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
nsfwNo
topicNo
lockedNoThreads only: lock so only moderators can unarchive.
reasonNoReason recorded in the server's audit log.
archivedNoThreads only: archive (true) or unarchive (false).
positionNoSort position within its category.
parent_idNoMove under this category.
channel_idYesChannel or thread ID.
slowmode_secondsNoPer-user message cooldown; 0 disables.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, so safety and idempotency are covered. The description adds the permission requirement and the partial-update behavior, which is genuinely useful context. It stops short of describing rate limits or side effects of archiving.

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?

Three short lines: action list, partial-update caveat plus permission, and return summary. Front-loaded with the operations and no wasted clauses.

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?

Output schema exists, so return values needn't be explained; the description still summarizes the confirmation. Permissions and partial-update semantics are covered. Minor gap: no mention of thread-vs-channel field restrictions beyond the per-param notes in the schema.

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 70%, with several params (locked, reason, archived, position, parent_id, slowmode_seconds) already documented in the schema. The description's list of actions maps to those params but adds no format or unit detail beyond the schema. Baseline 3 is appropriate.

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?

Specific verb list (rename, retopic, move, slowmode, archive/lock) plus the resource (channel/thread). It clearly distinguishes itself from siblings like discord_create_channel or discord_delete_channel by being the edit tool.

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?

States 'Only the fields you pass are changed' and the required permission (Manage Channels / Manage Threads for threads), which tells the agent when the call will succeed. It does not name sibling alternatives, but the edit-vs-create/delete distinction is implied by the verb set.

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

discord_edit_messageA
Idempotent

Replace the text of a message the bot sent. Cannot edit other users' messages.

Returns: Confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesMessage text; Discord Markdown allowed, max 2000 chars.
channel_idYesChannel, thread, or DM channel ID.
message_idYesMust be a message the bot itself sent.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description usefully adds the ownership restriction, but it omits whether the edit fully replaces prior content, permission requirements, or rate-limit behavior. The 'Returns: Confirmation.' line is minimal context, not real behavioral disclosure.

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

Conciseness4/5

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

Two short sentences, front-loaded with the action and the constraint; nothing is padded. The 'Returns: Confirmation.' line is largely redundant given a dedicated output schema exists, which is the only wasted element.

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 three-parameter mutation tool with an output schema, annotations, and full schema coverage, the description covers the essential constraint (bot-owned messages only). An agent has enough to call it correctly; only replace-vs-append semantics and failure modes are left unstated.

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 100% and each of the three parameters carries a substantive description (ID patterns, 2000-char Markdown limit, bot-ownership requirement). The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Replace the text of a message') and adds a scope qualifier ('the bot sent') that separates it from discord_send_message and discord_delete_message. It does not name a sibling explicitly, but the ownership restriction makes the tool's role 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 gives one hard precondition — the message must have been sent by the bot — which implies when the tool is applicable. It offers no explicit routing guidance versus alternatives such as discord_delete_message (for removal) or discord_send_message (for new content), so usage must be inferred.

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

discord_edit_roleA
Idempotent

Change a role's name, color, hoist/mentionable flags, or permissions. Only passed fields change.

Returns: Confirmation listing the fields changed.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
colorNoHex color like '#5865F2'.
hoistNo
reasonNoReason recorded in the server's audit log.
role_idYes
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
mentionableNo
permissionsNoPermission bitfield as a decimal string, e.g. '8' for Administrator.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnly=false, destructive=false, and idempotent=true, so the safety profile is covered. The description adds a genuine behavioral trait not in the annotations — partial-update semantics ('only passed fields change') — plus a return confirmation, but says nothing about required permissions or the risk of granting a permissions bitfield.

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

Conciseness4/5

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

Two tight sentences with the mutable-field list front-loaded and the partial-update rule immediately after. The 'Returns:' line is mildly redundant given an output schema exists, but it is short and costs little.

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 mutation tool with 8 parameters, the description covers the field set and patch behavior adequately, and the output schema means returns need not be detailed. It omits authorization requirements and the consequence of overwriting a role's permission bitfield, which an agent should know before calling.

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?

Schema coverage is only 50%, and the description usefully names exactly the undocumented fields (name, hoist, mentionable) alongside color and permissions, compensating for the gap. It still does not explain semantics such as what 'hoist' does or the permission bitfield encoding, which the schema handles only for permissions.

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

Purpose4/5

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

States a specific verb ('Change') and resource ('a role') and enumerates the mutable fields, so an agent can distinguish it from discord_create_role, discord_delete_role, and discord_list_roles without opening the schema. It stops short of explicitly naming a sibling or exclusion, so it is clear but not fully differentiated.

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?

'Only passed fields change' implies a patch-style update against an existing role, which is usable context. However, there is no explicit when-to-use guidance, no mention of prerequisites such as needing Manage Roles, and no comparison against alternatives like discord_set_member_role.

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

discord_get_audit_logA
Read-onlyIdempotent

Read the server's audit log — who did what (bans, kicks, deletions, channel/role changes) and why.

Needs View Audit Log. Use to answer "who deleted that channel" or "why was X banned".

Returns: Markdown table (time, actor, action, target, reason) or JSON list of entries
{id, time, actor{id, username}, action, target_id, reason, changes}.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
actionNoFilter by action name, e.g. 'member_ban_add', 'message_delete', 'channel_create'.
user_idNoOnly actions performed by this user or bot.
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, open-world, non-destructive. The description adds the non-obvious prerequisite 'Needs View Audit Log', which is exactly the kind of auth context annotations cannot express. It doesn't mention rate limits or pagination, so not a 5.

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?

Front-loads the core purpose, then permission requirement, then use cases, then return shape, in four short lines with zero filler. Every sentence carries distinct information.

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?

Covers purpose, permission requirement, intent examples, and return shape (including both markdown and JSON field sets). With an output schema also present, nothing needed for correct invocation is missing.

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 80%, so the schema already documents action, user_id, guild_id, and response_format. The description adds no parameter-level syntax or format detail beyond what the schema provides, which is the expected baseline when the schema does the heavy lifting.

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?

States a specific verb and resource ('Read the server's audit log') and immediately enumerates its content scope (bans, kicks, deletions, channel/role changes). None of the many siblings cover audit log retrieval, so it is clearly distinguishable.

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?

Gives concrete selection examples ('Use to answer "who deleted that channel" or "why was X banned"') that map to real agent intents. No explicit when-not-to-use or alternative-naming, which keeps it below a 5, but the intent routing is strong.

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

discord_get_channelA
Read-onlyIdempotent

Get one channel or thread: type, topic, parent, slowmode, and for threads the archive/lock state.

Returns: Markdown bullet list or JSON channel object.
ParametersJSON Schema
NameRequiredDescriptionDefault
channel_idYesChannel or thread ID.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds some context by naming thread-specific fields and return formats, but discloses no auth requirements, rate limits, or other operational behavior beyond what annotations and the output schema already provide.

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

Conciseness4/5

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

Two short sentences with the purpose and returned fields front-loaded. The second sentence about return format is somewhat redundant with the existing output schema, so it is not perfectly waste-free, but the definition remains compact and easy to scan.

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 read-only getter, the definition covers what the tool fetches, what fields are included, and how results are formatted. An output schema exists so return values need not be explained in depth, and the main gap is guidance on when to prefer this over the list-channel or list-thread siblings.

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 100%, so both channel_id and response_format are already documented in the schema. The description adds no parameter-level syntax, format, or constraint details, making the baseline 3 appropriate.

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

Purpose4/5

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

States a specific verb and resource: 'Get one channel or thread,' and enumerates the returned fields (type, topic, parent, slowmode, thread archive/lock state). This distinguishes it from bulk siblings in spirit, but it never names alternatives like discord_list_channels or discord_list_threads.

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 phrase 'Get one channel or thread' implies single-item lookup as opposed to listing, but there is no explicit when-to-use guidance, no when-not-to-use condition, and no named alternative. Usage is only inferable from the contrast with list-style siblings.

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

discord_get_guildB
Read-onlyIdempotent

Get details for one server: name, owner, member and online counts, creation date.

Returns: Markdown summary or JSON with id, name, owner_id, description,
approximate_member_count, approximate_presence_count, created_at, premium_tier.
ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds the return-shape context (Markdown summary vs JSON fields), but since an output schema exists this is largely redundant; no permissions, rate limits, or edge cases are disclosed.

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

Conciseness4/5

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

Two short, front-loaded sentences with no filler; the purpose comes first and the return list second. Slight redundancy in re-listing fields already present in the output schema keeps it from a 5.

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 read-only tool with two optional params, 100% schema coverage, and an output schema, the description covers the essentials. The only real gap is the absence of usage routing against sibling tools.

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 100%, so both parameters are already documented in the schema. The description does not add syntax, defaults, or format guidance beyond that, matching the baseline 3 when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb and resource ('Get details for one server') and enumerates the fields returned, so an agent knows what it retrieves. It does not explicitly distinguish itself from siblings like discord_list_guilds or discord_get_channel, so it stops short of a 5.

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 offers no when-to-use, when-not-to-use, or alternative-tool guidance. The only usage hint ('Omit to use DISCORD_GUILD_ID from .env') lives in the schema, not the description.

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

discord_get_memberA
Read-onlyIdempotent

Get one member's profile in this server: nickname, roles, join date, timeout status.

Returns: Markdown bullets or JSON member object.
ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context by naming the fields returned and the timeout status, but says nothing about auth requirements, permission scope, or failure modes for a missing/invalid member.

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

Conciseness4/5

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

Two tight sentences; purpose is front-loaded and the return-shape note follows. Every line carries some signal, though the 'Returns:' line is partly redundant with the existing output schema.

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?

With an output schema present and rich annotations, the description needn't restate return values, and it sufficiently frames the tool as a single-member read. The only gap is ambiguity on how to identify the member (ID vs username) and which server is targeted.

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 67% and both guild_id and response_format already carry descriptions in the schema. The description's 'Markdown bullets or JSON member object' loosely reflects response_format but adds no new parameter semantics, especially for the undocumented required user_id.

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?

Specific verb ('Get') plus resource ('one member's profile in this server') with an enumeration of the returned fields (nickname, roles, join date, timeout status). The phrase 'one member' implicitly distinguishes it from the bulk discord_list_members / discord_search_members siblings.

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?

Usage is only implied by 'one member's profile' versus the list/search siblings; there is no explicit statement of when to use this over discord_list_members or discord_search_members, nor any prerequisites for resolving the user.

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

discord_get_messageA
Read-onlyIdempotent

Fetch one message by ID, including attachments, embeds and reactions.

Returns: Markdown block or JSON message object (same shape as discord_read_messages items).
ParametersJSON Schema
NameRequiredDescriptionDefault
channel_idYesChannel, thread, or DM channel ID.
message_idYes
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine value by disclosing what content the fetch includes (attachments, embeds, reactions) and that JSON output matches discord_read_messages item shape, giving useful consistency context.

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?

Two short sentences, zero filler. The core action and its scope are front-loaded, and the returns note follows immediately.

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 read tool with rich annotations and an output schema, this is nearly complete: it names the included content, the two response formats, and cross-references the sibling item shape. It does not mention error behavior for missing/inaccessible messages, a minor gap.

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 67% and response_format already documents its markdown-vs-json tradeoff in the schema. The description reiterates 'by ID' and the return format but adds no syntax or constraints for message_id, which is undocumented in both places. Baseline 3 fits.

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

Purpose4/5

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

States a specific verb and resource with explicit scope: 'Fetch one message by ID, including attachments, embeds and reactions.' This implicitly separates it from the list-oriented discord_read_messages and discord_search_messages, but no sibling is named, so it falls short of full explicit differentiation.

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?

Usage is only implied by 'by ID' — an agent can infer this is the tool to call when it already has a message ID and wants the full message rather than a list. There is no explicit when-to-use, when-not-to-use, or pointer to discord_read_messages or discord_search_messages as alternatives.

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

discord_kick_memberA
Destructive

Remove a member from the server. They can rejoin with an invite. Needs Kick Members.

Confirm with the user before calling.

Returns: Confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason recorded in the server's audit log.
user_idYes
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and non-idempotent, so the safety profile is covered. The description adds value beyond them: reversibility ('can rejoin with an invite'), the required bot permission, and a confirmation requirement before an irreversible-to-the-user (though recoverable) action.

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

Conciseness4/5

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

Four short, front-loaded sentences with no filler; the action and reversibility lead. 'Returns: Confirmation.' is slightly redundant given an output schema exists, which keeps it from a 5.

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 destructive moderation tool with an output schema, the description covers action, reversibility, permission, and confirmation gating, which is enough to call it correctly. It doesn't note failure modes (e.g., missing permission or invalid user_id) but nothing essential is missing.

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 67% (reason and guild_id are documented; user_id is not). The description adds no parameter meaning at all – no mention of user_id source/format or how guild_id defaults. Baseline 3 is appropriate when the schema does most of the work but a gap remains unaddressed.

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?

States a specific verb and resource ('Remove a member from the server'). Crucially, 'They can rejoin with an invite' distinguishes it from discord_ban_member without the agent needing to open either schema, and the sibling set confirms ban/timeout are the relevant alternatives.

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?

Provides the permission prerequisite ('Needs Kick Members') and an operational gate ('Confirm with the user before calling'), plus implicit selection guidance via the rejoin note. It never explicitly names ban_member/timeout_member as alternatives, so it falls short of a 5.

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

discord_list_bansA
Read-onlyIdempotent

List banned users and the reason recorded for each. Needs Ban Members.

Returns: Markdown table (user, reason) or JSON list of {user_id, username, reason}.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), so the bar is lower; the description still adds the permission requirement and the exact output shapes, which are not in the annotations. It does not mention pagination behavior for the limit, a minor omission.

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?

Two short sentences with the action front-loaded and a labeled 'Returns:' clause; every phrase carries information and nothing is padded.

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?

An output schema exists so return values need not be described, yet the description restates them helpfully and covers the auth prerequisite. The only gap is the undocumented limit parameter, which is minor for a read-only list tool.

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 67%: guild_id and response_format are documented in the schema while limit is not. The description reinforces response_format by spelling out what 'markdown' vs 'json' produce, but adds nothing about the limit parameter, so it only partially compensates for the gap.

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

Purpose4/5

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

States a specific verb and resource ('List banned users') plus the payload it returns ('the reason recorded for each'), making it clearly distinct from the ban/unban siblings. It stops short of naming a sibling to route against, so it is clear but not maximally differentiated.

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 supplies a prerequisite ('Needs Ban Members'), which is genuine usage context, but offers no when-to-use vs when-not guidance and never points to alternatives such as discord_get_audit_log or discord_unban_member. Usage is implied by the name rather than stated.

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

discord_list_channelsA
Read-onlyIdempotent

List a server's channels and categories, optionally filtered by kind or name.

The usual way to find a channel_id before reading or posting. Threads are not
included — use discord_list_threads.

Returns: Markdown table (name, type, ID, category, topic) or JSON list of channel objects
with id, name, type, parent_id, position, topic.
ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoOnly return channels of this kind.
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
name_containsNoCase-insensitive substring filter on the name, e.g. 'general'.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive behavior, so the safety profile is covered. The description still adds real value beyond that by stating the threads exclusion and the exact return shape. It stops short of richer context (pagination, auth scope, ordering guarantees), so a 4 rather than a 5.

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?

Three short, front-loaded sentences: purpose, routing hint, then return contract. No filler, and the most decision-relevant facts (what it lists, the threads caveat, the return format) come first.

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?

For a read-only list tool with full schema coverage and an output schema, the description covers everything an agent needs: scope, the sibling alternative, and a summary of the return shape. Nothing essential is missing.

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 100%, so the baseline is 3. The description references kind and name filtering, which loosely map to the 'type' and 'name_contains' parameters, but the schema already documents each field with examples and patterns, so the description adds little beyond it.

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 first sentence gives a specific verb and resource ('List a server's channels and categories') plus the scope of optional filtering. It also explicitly distinguishes itself from discord_list_threads ('Threads are not included'), so an agent can differentiate it from siblings without opening a schema.

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

Usage Guidelines5/5

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

It states the primary use case explicitly ('The usual way to find a channel_id before reading or posting') and names the alternative for the excluded case ('use discord_list_threads'). When-to-use and the contrasting tool are both spelled out.

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

discord_list_guildsA
Read-onlyIdempotent

List every server (guild) the bot has been invited to.

A bot only sees servers where someone with Manage Server added it — it cannot browse
servers it isn't in. Use this to find a guild_id.

Returns: Markdown table of name and ID, or JSON list of {id, name, owner, permissions}
where `owner` means the bot's owner owns the server.
ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/openWorld safety, but the description adds real behavioral context: the bot only sees guilds where someone with Manage Server added it, and it cannot browse outside its memberships. That permission/visibility constraint is not derivable from the annotations.

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

Conciseness4/5

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

Front-loaded with the core purpose, then a useful visibility caveat, then usage guidance and returns. Slightly padded by a returns block that duplicates the output schema, but no sentence is wasteful enough to break flow.

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?

An output schema exists, so return values need not be restated, yet the description goes further by clarifying that `owner` means the bot's owner owns the server — non-obvious interpretation help. Combined with annotations covering safety, the agent has everything needed to call 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?

Schema description coverage is 100%, so the single response_format parameter is fully documented by the schema itself. The description's 'Markdown table ... or JSON list' phrasing mirrors the schema's markdown/json enum without adding syntax or constraint details, so the baseline 3 applies.

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?

States a specific verb and resource ('List every server (guild) the bot has been invited to') with clear scope. The 'bot has been invited to' qualifier implicitly distinguishes it from discord_get_guild, which fetches one guild by ID.

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?

Explicitly says 'Use this to find a guild_id', giving a clear reason to invoke the tool. It does not name a specific alternative (e.g., discord_get_guild) or an explicit when-not condition, so it stops short of a 5.

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

discord_list_membersA
Read-onlyIdempotent

List server members in join order with cursor pagination.

Requires the Server Members privileged intent to be enabled for the bot in the
developer portal; otherwise Discord returns Missing Access.

Returns: Markdown table or JSON envelope {count, limit, has_more, next_after, items}.
ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoUser ID cursor from the previous page's `next_after`.
limitNoHow many members to return.
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely new behavior: the privileged-intent requirement and the resulting Missing Access failure mode, which annotations cannot express. The 'Returns:' line largely restates the output schema, so it earns less credit.

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

Conciseness4/5

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

Two short paragraphs, front-loaded with the core action and then the critical precondition, with no filler sentences. The trailing 'Returns:' sentence slightly duplicates the output schema, costing a point.

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?

For a read-only list tool with a full output schema and annotations, the description covers the remaining agent-relevant risks: the privileged intent gotcha, the exact error it produces, and the cursor-based continuation model. Nothing needed to call it correctly is missing.

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 100%, so every parameter (after, limit, guild_id, response_format) is already documented in the schema. The description adds only the pagination loop hint via next_after, which the schema itself already states, so baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb and resource ('List server members') plus a scoping qualifier ('in join order with cursor pagination') that implicitly separates it from discord_search_members and discord_get_member. It never names those siblings, so the differentiation is left for the agent to infer rather than stated outright.

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 gives a real precondition (Server Members privileged intent must be enabled, else Missing Access), which is a usage condition. However, it never says when to prefer this tool over discord_search_members or discord_get_member, so the agent must guess between siblings.

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

discord_list_pinsA
Read-onlyIdempotent

List the pinned messages in a channel (max 50).

Returns: Markdown messages or JSON list, same shape as discord_read_messages items.
ParametersJSON Schema
NameRequiredDescriptionDefault
channel_idYesChannel, thread, or DM channel ID.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower; the description adds genuine value with the 50-item cap and a cross-tool shape reference ('same shape as discord_read_messages items'). It does not say what happens when a channel exceeds 50 pins, which is the one behavioral gap.

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?

Two sentences, zero waste, with the core action and the hard cap front-loaded before the return-shape note. Every clause 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?

With a full output schema and comprehensive annotations, the description carries little extra burden, and it correctly covers the cap and return shape. It omits what an agent should do when a channel has more than 50 pins (pagination / truncation behavior), which is the only loose end.

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 100%, so both parameters are already documented, establishing a baseline of 3. The description only loosely implies the response_format choice ('Markdown messages or JSON list') without adding syntax or format detail beyond the schema.

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

Purpose4/5

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

States a specific verb+resource ('List the pinned messages in a channel') plus a meaningful scope cap (max 50), so it is clearly distinguishable from discord_pin_message and discord_read_messages. It stops short of naming how it relates to those siblings, keeping it at 4 rather than 5.

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?

Usage is implied by the resource name — an agent can infer it is for enumerating existing pins — but there is no explicit when-to-use guidance relative to alternatives such as discord_read_messages or discord_get_message, and no prerequisite/auth context.

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

discord_list_rolesA
Read-onlyIdempotent

List a server's roles from highest to lowest, with IDs, colors and flags.

Use to find role_id for discord_set_member_role. Permission bitfields are in the JSON output.

Returns: Markdown table (name, ID, color, hoisted, mentionable, managed) or JSON list.
ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds return-format details and the permission bitfield note, but since an output schema exists, some of this is redundant; no rate-limit or pagination context.

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

Conciseness4/5

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

Three short, front-loaded lines: purpose, usage pointer, return shape. Efficient, though the 'Returns' line partially duplicates what the output schema already conveys.

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 an output schema exists, the description needn't detail return values, yet it still summarizes them coherently. Covers ordering, downstream use and permission data; only pagination/limits are unaddressed.

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 100%, so guild_id and response_format are fully documented in the schema, including the DISCORD_GUILD_ID fallback. The description adds no param-level detail beyond what the schema provides; baseline 3 applies.

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?

Specific verb+resource ('List a server's roles') with ordering stated ('highest to lowest') and the fields returned enumerated. Clearly distinguishable from siblings like discord_get_guild or discord_list_members.

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

Usage Guidelines5/5

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

Explicitly names the downstream tool the output feeds ('Use to find role_id for discord_set_member_role'), giving the agent a clear when-to-use condition. Permission bitfield location is also noted.

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

discord_list_threadsA
Read-onlyIdempotent

List active (unarchived) threads in a server, optionally only under one channel.

Returns: Markdown table (name, ID, parent, messages, members) or JSON list.
Archived threads are not included.
ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
channel_idNoOnly threads whose parent is this channel.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, so the bar is lower. The description adds genuinely useful behavioral context the annotations lack: only unarchived threads are returned, and archived threads are explicitly excluded, which an agent must know to interpret results correctly.

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?

Purpose is front-loaded in the first sentence, followed by return format and the exclusion note. Three short lines, zero padding, each sentence carrying distinct information.

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?

With a rich schema (100% coverage), full annotations, and an output schema present, the definition is nearly complete. It omits any mention of result limits or pagination for servers with many threads, which is a minor gap given the otherwise strong coverage.

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 100%, so guild_id, channel_id, and response_format are fully documented in the schema (including the .env fallback for guild_id). The description confirms channel_id narrows to a parent channel but adds no syntax or format detail beyond the schema, so baseline 3 applies.

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?

States a specific verb (List) and resource (threads) with a precise scope qualifier (active/unarchived). The optional channel scoping distinguishes it from a generic thread enumeration and from sibling channel tools like discord_list_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?

The description implies usage via the channel_id filter ('optionally only under one channel') but never states when to prefer this tool over siblings such as discord_list_channels or discord_get_channel. No explicit when-not guidance is given.

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

discord_pin_messageB
Idempotent

Pin or unpin a message in its channel. Needs Manage Messages.

Returns: Confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault
actionNopin
reasonNoReason recorded in the server's audit log.
channel_idYesChannel, thread, or DM channel ID.
message_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, covering the safety profile. The description adds a genuine auth requirement ('Needs Manage Messages'), which is useful context, but says nothing about rate limits, behavior on already-pinned messages, or unpin side effects. With annotations carrying most of the burden, a 3 is appropriate.

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

Conciseness4/5

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

Two short lines with the core action front-loaded and no filler. The 'Returns: Confirmation' line is largely redundant given an output schema exists, which costs it a point.

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 mutation tool, the description covers the action and the permission requirement, and the return value is handled by the output schema. It omits any routing guidance relative to list_pins/delete_message, which leaves a gap an agent could need.

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 50%: reason and channel_id are documented in the schema, while action and message_id are not. The description's 'pin or unpin' and 'in its channel' loosely map to the action and channel_id parameters but add no syntax or format detail, so it only partially compensates for the coverage gap.

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

Purpose4/5

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

The description names a specific verb pair (pin/unpin) and resource (a message in its channel), so the agent knows exactly what operation is performed. It does not explicitly differentiate from the sibling discord_list_pins or explain the relationship, which keeps it short of a 5.

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?

Usage is only implied by the verb – there is no statement of when to pin/unpin versus using siblings like list_pins or delete_message. The 'Needs Manage Messages' clause functions as a prerequisite/condition rather than an explicit when-to-use rule, so guidance is present but thin.

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

discord_reactA
Idempotent

Add or remove the bot's own reaction on a message.

Returns: Confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault
emojiYesUnicode emoji like '👍', or a custom emoji as 'name:id' or '<:name:id>'.
actionNoadd
channel_idYesChannel, thread, or DM channel ID.
message_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=true, covering the safety profile. The description adds one genuinely useful behavioral fact beyond that: the reaction is the bot's own identity, not an arbitrary user's. It says nothing about rate limits or permission requirements, so it goes modestly past the annotations but not far.

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

Conciseness4/5

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

Two short sentences with the operation front-loaded and no preamble. The trailing 'Returns: Confirmation.' is largely redundant given the output schema exists, costing it a point.

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 reaction mutation with annotations and an output schema present, the description covers the essentials and the identity-scoping constraint. Remaining gaps are the undocumented message_id parameter and the absence of any when-to-use or permission context, which keeps it short of a 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 coverage is 50%: emoji and channel_id are documented in the schema, while message_id and action are not. The description's 'add or remove' maps loosely to the action enum but adds no new detail on message_id or emoji format. Marginal compensation for the coverage gap, so baseline 3 is appropriate.

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?

States a specific verb pair (add/remove) and resource (reaction on a message), and uniquely scopes it to 'the bot's own reaction'. No sibling tool manipulates reactions, so the resource alone distinguishes it from discord_send_message, discord_edit_message, and the rest of the message family.

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 via 'add or remove' but never states when to call this versus alternatives (e.g., reacting vs. replying), nor any prerequisites like needing the message to exist or the bot having channel access. Usage is inferable but not guided.

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

discord_read_messagesA
Read-onlyIdempotent

Read recent messages from a channel or thread, newest first, with cursor pagination.

Needs the Message Content intent enabled for the bot or every message reads as empty.
Pass only one of before / after / around.

Returns: Markdown — each message as author, time, ID, text, attachments, reactions,
oldest at top; a footer gives the `before` cursor for the next page. JSON — envelope
{count, limit, has_more, next_before, items:[{id, channel_id, author{id, username,
display_name, bot}, content, timestamp, edited_timestamp, pinned, attachments?,
embeds?, reactions?, reply_to?, thread_id?}]}.
ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoOnly messages newer than this message ID.
limitNoHow many messages, newest first.
aroundNoMessages surrounding this message ID.
beforeNoOnly messages older than this message ID — pass `next_before` from the previous page.
channel_idYesChannel, thread, or DM channel ID.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real operational context on top: a required bot intent whose absence silently yields empty content, cursor-based pagination semantics, and the mutually exclusive cursor constraint. This is exactly the kind of failure mode an agent needs warned about before calling.

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

Conciseness4/5

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

Front-loaded with purpose, then the intent warning, then the cursor constraint, then returns. The return-format block is long and largely duplicated by the output schema, which is the one place it does not fully earn its space.

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?

With an output schema present and 100% parameter coverage, the description only needs to supply what structured fields cannot: the intent prerequisite, cursor pagination model, and cursor exclusivity. All three are present, so nothing an agent needs to call this correctly is missing.

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?

Schema description coverage is 100%, so the baseline is 3. The description earns a bump by stating the one-of constraint across before/after/around, which the schema does not encode (no exclusiveMaximum/oneOf), and by tying `before` to the previous page's cursor.

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

Purpose4/5

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

States a specific verb (read) and resource (messages) plus scope (a channel or thread, newest first, cursor-paginated), which implicitly separates it from discord_get_message (single ID) and discord_search_messages. It never names a sibling or an alternative, so the differentiation is inferred rather than explicit.

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?

Gives two concrete conditions: the Message Content intent must be enabled or reads come back empty, and only one of before/after/around may be passed. What is missing is routing guidance against the neighboring read tools (search_messages, get_message, list_pins).

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

discord_search_membersA
Read-onlyIdempotent

Find server members whose username or nickname starts with a string.

The quickest way to turn a name into a user_id. Does not need the privileged
Server Members intent (unlike discord_list_members).

Returns: Markdown table (member, roles, joined) or JSON list of {user_id, username,
display_name, nick, bot, roles, joined_at, timed_out_until}.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYesUsername or nickname prefix, e.g. 'jam' finds 'James'.
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, open-world and non-destructive traits. The description adds genuinely useful behavioral context beyond that: the privileged-intent requirement difference versus discord_list_members and the two possible response shapes. Auth/permission details and search behavior on multiple matches are not covered, so it stops short of a 5.

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?

Three short blocks: what it does, why it beats the alternative, what comes back. Scoping and the routing hint are front-loaded, and every sentence carries information.

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?

Covers purpose, alternative, intent caveat and return shape for a 4-param read tool with a structured schema and output schema. Some return-value detail is duplicated rather than additive, and it omits behavior when several members match or when nothing matches, keeping it from a 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 coverage is 75% and the schema itself supplies the prefix example for 'query' and the guild_id env fallback. The description adds return-field names but no syntax or constraint detail for limit, query or guild_id, so the baseline 3 applies.

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?

States a precise verb+resource+scope: prefix search over username or nickname. It explicitly distinguishes itself from the sibling discord_list_members, so an agent can route between them without opening schemas.

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

Usage Guidelines5/5

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

Gives the when-to-use framing ('quickest way to turn a name into a user_id') and names the alternative (discord_list_members) along with the deciding condition (no privileged Server Members intent required). Nothing is left to inference.

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

discord_search_messagesA
Read-onlyIdempotent

Find messages in a channel containing a phrase, optionally by one author.

Discord's search API is not available to bots, so this scans the most recent
`max_scan` messages page by page (100 per API call) and filters locally. For "what
did X say about Y last week" this is the tool; for older history raise max_scan.

Returns: Matching messages (Markdown or JSON, same shape as discord_read_messages) plus
how many messages were scanned and the oldest one reached.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax matches to return.
queryYesCase-insensitive substring to look for in message text.
max_scanNoHow many recent messages to scan, newest first. Larger = slower.
author_idNoOnly messages by this user.
channel_idYesChannel, thread, or DM channel ID.
response_formatNo'markdown' for reading, 'json' for full structured data.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, openWorld), and the description adds crucial behavior the annotations cannot convey: Discord's search API is unavailable to bots, so it pages through 100 messages per call and filters locally. It also discloses the cost/latency tradeoff of increasing max_scan and summarizes the return payload.

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?

Front-loads the purpose, then the implementation constraint, then the when-to-use heuristic, then the return shape. Three tight sentences with no filler or repetition.

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 an output schema exists, the description need only set expectations and it does: filtering semantics, scan limits, and a brief return summary. Nothing required to call this tool correctly is missing for a 6-param read tool.

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?

Schema coverage is 100%, so the baseline is 3; the description still adds meaning by explaining the max_scan/recency relationship ('raise max_scan' for older history) and by tying the result format to discord_read_messages' shape. It does not add syntax detail beyond the schema, but it enriches the two parameters that drive scan 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?

States a specific verb and resource ('Find messages in a channel containing a phrase') plus an optional scope qualifier ('optionally by one author'). It clearly distinguishes itself from discord_read_messages and discord_get_message by describing local substring filtering rather than retrieval by ID.

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?

Gives a concrete use-case ('what did X say about Y last week') and a tuning instruction ('for older history raise max_scan'). It stops short of explicitly naming sibling alternatives like discord_read_messages or stating when not to use this scan-based approach.

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

discord_send_dmA

Send a direct message from the bot to a user.

Fails if the user has DMs from server members/bots disabled. Confirm with the user
before sending — DMs feel more personal than channel posts.

Returns: Confirmation with the DM channel ID (reuse it with discord_read_messages to see replies).
ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesMessage text; Discord Markdown allowed, max 2000 chars.
user_idYesUser to message. They must share a server with the bot and allow DMs from it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare the generic non-readOnly/non-idempotent/open-world profile; the description adds real context: the tool fails when the recipient has DMs from server members/bots disabled, that user consent should be obtained first, and that the returned DM channel ID can be reused. It stops short of stating rate limits or whether the message can be recalled, which would be the remaining gap.

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?

Three short paragraphs with the action front-loaded, then the failure/consent caveat, then the return value. Every sentence carries distinct information and nothing is redundant.

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?

With an output schema present, the description need not document the return payload, and it correctly refrains from doing so while still hinting at the reusable channel ID. Annotations plus schema plus description cover safety, failure mode, and follow-up path; only edge cases like rate limiting or bot-permission errors are unaddressed.

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 100%, so both user_id (pattern, DM-allowance constraint) and content (Markdown, 2000-char cap) are already documented in the schema. The description adds no syntax or format detail beyond that, so the baseline 3 applies.

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?

States a specific verb and resource ('Send a direct message from the bot to a user') and implicitly separates itself from the channel-post sibling by noting 'DMs feel more personal than channel posts'. An agent can tell this apart from discord_send_message without opening either schema.

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?

Gives an explicit operational precondition ('Confirm with the user before sending') and a failure condition tied to recipient DM settings. It lacks an explicit when-not/alternative routing statement naming discord_send_message, but the context for choosing a DM is clear.

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

discord_send_messageA

Post a message to a channel, thread, or DM channel as the bot. Optionally as a reply.

Visible to everyone in the channel immediately — confirm wording with the user first.
Mentions do not ping unless allow_mentions is true.

Returns: Confirmation with the new message ID and a jump link.
ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesMessage text; Discord Markdown allowed, max 2000 chars.
reply_toNoMessage ID to reply to.
channel_idYesChannel, thread, or DM channel ID.
allow_mentionsNoLet @user/@role/@everyone in the text actually ping. Off by default to avoid accidental mass pings.
mention_reply_authorNoWhen replying, ping the original author.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds meaningful behavior beyond them: immediate public visibility, the mention-ping gating rule, and the returned confirmation with message ID and jump link.

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?

Four short, front-loaded lines: the core action first, then the safety caveat, then the mention rule, then the return shape. No filler, and each sentence carries distinct information.

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?

For a 5-param send tool, annotations cover the safety profile, the output schema covers the return value (which the description also summarizes), and the description covers visibility and mention behavior. Nothing needed to call it correctly is missing.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics for allow_mentions ("mentions do not ping unless allow_mentions is true"), which is the non-obvious behavioral implication of that flag.

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

Purpose4/5

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

States a specific verb and resource ("Post a message") plus the target surfaces (channel, thread, DM channel). It's clear what it does, but it doesn't differentiate from the sibling discord_send_dm, which overlaps on the DM case, so sibling disambiguation is incomplete.

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?

Gives actionable context: the message is immediately visible to everyone, so confirm wording with the user first, and mentions won't ping unless allow_mentions is set. This is clear guidance, though it never states when to prefer this over discord_send_dm or discord_edit_message.

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

discord_set_member_roleA
Idempotent

Give a role to a member, or take it away.

Needs Manage Roles, and the bot's own top role must sit above the role being assigned.

Returns: Confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoadd
reasonNoReason recorded in the server's audit log.
role_idYesRole to add or remove (find with discord_list_roles).
user_idYes
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is partly covered. The description adds meaningful context beyond them: the required Manage Roles permission and the role-hierarchy constraint. It does not describe side effects or audit-log behavior, but the auth requirements are a solid addition.

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

Conciseness4/5

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

Three short, front-loaded sentences with no filler, and the core purpose leads. 'Returns: Confirmation.' is minimal and largely redundant given an output schema exists, which trims a point.

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?

With an output schema present the description need not explain return values, and annotations cover the mutation/idempotency profile. The permission and hierarchy prerequisites are the key operational detail an agent needs, so coverage is largely complete, with only the action/undo semantics left partly implicit.

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 60% (action and user_id are undocumented there). The description maps 'give a role / take it away' to the add/remove action enum and the role_id target, adding some meaning over the schema. But it says nothing about user_id or guild_id resolution, so it only partially compensates.

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

Purpose4/5

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

The description gives a specific verb and resource ('Give a role to a member, or take it away'), clearly stating that it manages member-role assignment rather than editing the role object itself. It is distinguishable from discord_edit_role/discord_delete_role, though it never names a sibling explicitly.

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?

It states the prerequisite permissions ('Needs Manage Roles, and the bot's own top role must sit above the role being assigned'), which is useful for deciding whether the call can succeed. However, it gives no when-to-use/when-not guidance and never points to an alternative tool.

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

discord_timeout_memberA
Idempotent

Time out a member (no posting, reacting or voice) for up to 28 days, or lift a timeout with minutes=0.

Needs Moderate Members. Confirm with the user before applying.

Returns: Confirmation with the time the timeout ends.
ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason recorded in the server's audit log.
minutesYesLength in minutes (max 28 days = 40320). 0 lifts an existing timeout.
user_idYes
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark this as a non-read-only, idempotent, non-destructive open-world mutation, so the safety profile is covered. The description adds real value beyond them: the required permission level, a human-confirmation requirement, and the shape of the confirmation returned. It omits failure behavior (e.g. target above the bot's role hierarchy), keeping it short of a 5.

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?

Three short lines: purpose and duration bound first, lift semantics second, permission/confirmation third, return value last. No filler sentences and every line carries information.

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?

An output schema exists, so return values need only a pointer, which the description provides. Permissions, confirmation, mutation semantics and the lift case are all covered; only error/edge-case behavior is absent, which is a minor gap for a 4-parameter tool.

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 75%, with minutes, reason and guild_id already documented in the schema, including the 0-lifts-timeout and 40320-max semantics the description repeats. user_id has only a pattern and no prose in either place, so the description does not compensate for the remaining gap.

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?

States a specific verb (time out), the target resource (a member), the concrete effects (no posting, reacting or voice), the duration bound, and the inverse operation (minutes=0 lifts). An agent can distinguish this from discord_kick_member and discord_ban_member purely from the described effect.

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?

Gives a prerequisite (Needs Moderate Members) and an explicit behavioral instruction to confirm with the user before applying, plus the lift-a-timeout case. It does not name the moderation siblings it should be chosen over, but the when-to-use context is clear.

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

discord_unban_memberA
Idempotent

Lift a ban so the user can rejoin. Needs Ban Members.

Returns: Confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason recorded in the server's audit log.
user_idYes
guild_idNoServer (guild) ID. Omit to use DISCORD_GUILD_ID from .env.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true. The description's note about needing 'Ban Members' permission adds useful context beyond the annotations. However, it doesn't clarify what 'Confirmation' means as a return value—the output schema may cover that, but the description is thin on behavioral detail beyond the permission requirement.

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?

Extremely concise: one sentence for the purpose and one for the permission requirement, plus a brief return note. Front-loaded and waste-free.

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 mutation tool with an output schema and annotations, the description covers the core action and permission requirement minimally. It lacks details on error handling (e.g., if user isn't banned), audit logging behavior for the reason parameter, or any caveats, leaving gaps that could affect correct invocation.

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 67%, with user_id having no description but reason and guild_id documented in the schema. The description doesn't add parameter information beyond what's in the schema. Baseline 3 is appropriate given partial schema coverage and no supplementary parameter semantics in the description.

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

Purpose4/5

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

States a specific verb+resource: 'Lift a ban so the user can rejoin.' Clearly distinguishable from siblings like discord_ban_member and discord_kick_member. The 'Returns: Confirmation' line adds little but doesn't detract.

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 a prerequisite ('Needs Ban Members') but doesn't explicitly say when to use this versus alternatives, or when-not to use it (e.g., for timed bans versus permanent bans). Usage is implied rather than spelled out.

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

discord_whoamiA
Read-onlyIdempotent

Identify the bot account this server is running as.

Use first to confirm the token works, and to learn the bot's own user ID (needed to
tell the bot's messages apart from other people's).

Returns: `Name (@username, ID) [bot]` plus the bot's creation date.
Errors: `Error: Invalid bot token…` if DISCORD_BOT_TOKEN is wrong or missing.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and open-world behavior, so the safety profile is covered. The description adds genuine value beyond that by disclosing the failure mode ('Error: Invalid bot token…' when DISCORD_BOT_TOKEN is wrong or missing), though the return-format sentence is largely redundant given an output schema exists.

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?

Three tight lines: purpose first, then usage, then returns/errors. Every sentence earns its place and nothing is padded.

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?

For a 0-param, read-only identity probe with annotations and an output schema, the description covers purpose, correct timing, output shape, and the auth failure case. An agent has everything needed to call it and interpret the result.

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 tool takes zero parameters, so there is nothing for the description to disambiguate — the baseline for a 0-param tool is 4. No syntax, defaults, or naming ambiguities exist to explain.

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?

States a specific verb+resource ('Identify the bot account this server is running as') with clear scope, and no sibling tool overlaps with it — the surrounding tools all operate on channels, messages, members, or roles.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('Use first to confirm the token works') and gives the downstream reason (the bot's own user ID is needed to distinguish the bot's messages from others'). This is actionable guidance an agent can act on without inference.

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.

  1. 35 tool updatesv0.1.0
    • First observeddiscord_ban_member
    • First observeddiscord_bulk_delete_messages
    • First observeddiscord_create_channel
    • First observeddiscord_create_role
    • First observeddiscord_create_thread
    • First observeddiscord_delete_channel
    • First observeddiscord_delete_message
    • First observeddiscord_delete_role
    • First observeddiscord_edit_channel
    • First observeddiscord_edit_message
    • First observeddiscord_edit_role
    • First observeddiscord_get_audit_log
    • First observeddiscord_get_channel
    • First observeddiscord_get_guild
    • First observeddiscord_get_member
    • First observeddiscord_get_message
    • First observeddiscord_kick_member
    • First observeddiscord_list_bans
    • First observeddiscord_list_channels
    • First observeddiscord_list_guilds
    • First observeddiscord_list_members
    • First observeddiscord_list_pins
    • First observeddiscord_list_roles
    • First observeddiscord_list_threads
    • First observeddiscord_pin_message
    • First observeddiscord_react
    • First observeddiscord_read_messages
    • First observeddiscord_search_members
    • First observeddiscord_search_messages
    • First observeddiscord_send_dm
    • First observeddiscord_send_message
    • First observeddiscord_set_member_role
    • First observeddiscord_timeout_member
    • First observeddiscord_unban_member
    • First observeddiscord_whoami

TDQS

A3.9/5.0

Scored across 35 tools

Disambiguation5/5

Each tool targets a distinct resource plus action (list/get/create/edit/delete on channels, roles, members, messages), and descriptions explicitly disambiguate the closest pairs like discord_delete_message vs discord_bulk_delete_messages and discord_search_members vs discord_list_members. The channel/thread overlap is handled by clear notes (e.g. discord_get_channel covers threads, discord_send_message accepts a thread ID).

Naming Consistency5/5

Every tool follows a strict discord_verb_noun pattern (discord_list_channels, discord_create_role, discord_ban_member) with the same namespace prefix. No camelCase or naming drift anywhere in the set.

Tool Count3/5

35 tools is heavy and at the upper end of what an agent can reliably select from, even though Discord is a genuinely broad domain. Most tools earn their place, but some (pins, reactions, bulk delete) could be consolidated.

Completeness4/5

Coverage is strong across messages, channels, threads, roles, members, moderation, and the audit log, including lifecycle operations like edit/delete and unban. Minor gaps remain (invites, emoji/sticker/webhook management, guild settings), but core workflows have no dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that provides native Discord tools for Claude Code, enabling bidirectional communication with remote agents or humans via the Discord REST API. It allows users to send messages, read channel history, and manage reactions directly from their local environment.
    6
    13 npm
    3
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server providing 26 tools for Discord API interactions, enabling message management, moderation, channel operations, and server inspection through Claude Code, Paperclip agents, or other MCP-compatible clients.
    26
    MIT
  • A
    license
    Not graded
    quality
    F
    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.
    9 npm
    3
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to read, post to, and moderate a Discord server through the Discord REST API, with opt-in guardrails and dry-run safeguards.
    -