Skip to main content
Glama
TinyGecko920

discord-provisioner-mcp

by TinyGecko920

discord-provisioner-mcp

An MCP (Model Context Protocol) server that lets an AI assistant provision Discord servers -- guilds, categories, channels, roles, and permission overwrites -- from a declarative blueprint.

  • Talks to the Discord REST API directly (no discord.js); behaviour is explicit and dependencies stay thin (@modelcontextprotocol/sdk + zod).

  • Plans before it acts: apply_blueprint diffs the blueprint against live state, applies only the difference, and never deletes anything.

  • Running the same blueprint twice produces zero write operations the second time.

  • Rate-limit aware: per-bucket queues, global 429 handling, serialised writes with a configurable inter-write delay.

  • Two transports: stdio (Claude Code and other local clients) and Streamable HTTP with bearer auth (claude.ai custom connector).

Requirements

  • Node.js 20+

  • A Discord application with a bot token

Related MCP server: neuron

Setup

npm install
npm run build

Copy .env.example to .env (or export the variables however you prefer) and set at least DISCORD_BOT_TOKEN.

Variable

Required

Default

Purpose

DISCORD_BOT_TOKEN

yes

--

Bot token from the developer portal

DISCORD_API_VERSION

no

v10

REST API version segment

DRY_RUN

no

false

true = no write request ever reaches Discord

LOG_LEVEL

no

info

debug, info, warn, error, silent

WRITE_DELAY_MS

no

250

Minimum delay between consecutive writes

MCP_AUTH_TOKEN

in HTTP mode

--

Bearer token HTTP clients must present

All logging goes to stderr as JSON lines. In stdio mode stdout carries the MCP protocol, so nothing else ever writes to stdout. The bot token is registered with the logger's redaction list and never appears in logs, error messages, or tool output.

Creating the Discord application and bot

  1. Go to https://discord.com/developers/applications and click New Application.

  2. Open the Bot tab and click Reset Token to reveal the bot token. Store it as DISCORD_BOT_TOKEN. Treat it like a password.

  3. No privileged gateway intents are needed; this server uses REST only.

Inviting the bot to an existing server

Use an OAuth2 URL with the bot scope. Minimum permissions for this server's tools: Manage Channels, Manage Roles, View Channels. That permission set is the integer 268436496 (MANAGE_CHANNELS 16 + VIEW_CHANNEL 1024 + MANAGE_ROLES 268435456):

https://discord.com/oauth2/authorize?client_id=YOUR_APP_ID&scope=bot&permissions=268436496

The person clicking the link needs Manage Server on the target guild.

Two gotchas worth knowing up front

  • 10-guild limit on create_guild. Discord only lets a bot create guilds while it is a member of fewer than 10. get_bot_info reports your headroom, and create_guild fails with a clear message when over the limit. The normal path at scale: create the server manually, invite the bot, then run apply_blueprint.

  • Role hierarchy. A bot can only manage roles strictly below its own highest role. If role creation or overwrite calls fail with Missing Permissions (50013) or 403 even though the bot has Manage Roles, drag the bot's role above the roles it manages in Server Settings -> Roles. This is the most common confusing failure; the error hint calls it out.

Running

stdio (default)

node dist/index.js

or during development:

npm run dev

Streamable HTTP

MCP_AUTH_TOKEN=some-long-random-string node dist/index.js --http --port 3000
  • Endpoint: POST/GET/DELETE http://127.0.0.1:3000/mcp (plus GET /healthz, unauthenticated).

  • Every /mcp request must send Authorization: Bearer <MCP_AUTH_TOKEN>; anything else gets a 401. The comparison is constant-time.

  • Sessions follow the Streamable HTTP spec: the initialize response carries an mcp-session-id header, later requests echo it, DELETE ends the session.

  • Binds 127.0.0.1 by default; pass --host 0.0.0.0 to expose it (put TLS in front first).

Registering with Claude Code

claude mcp add discord \
  -e DISCORD_BOT_TOKEN=your-bot-token \
  -- node /absolute/path/to/discord-mcp/dist/index.js

Or in a project .mcp.json:

{
  "mcpServers": {
    "discord": {
      "command": "node",
      "args": ["/absolute/path/to/discord-mcp/dist/index.js"],
      "env": {
        "DISCORD_BOT_TOKEN": "your-bot-token"
      }
    }
  }
}

Registering as a claude.ai custom connector

  1. Run in HTTP mode behind a public HTTPS URL (reverse proxy or tunnel -- e.g. Cloudflare Tunnel -- terminating TLS in front of --http --port 3000).

  2. In claude.ai: Settings -> Connectors -> Add custom connector, and give it https://your-host/mcp.

  3. Auth caveat: the custom connector UI does not let you attach an arbitrary static bearer header. If your connector setup cannot send Authorization: Bearer <MCP_AUTH_TOKEN>, put the token injection in the fronting proxy (add the header there) and restrict who can reach the proxy. Do not expose the server without the bearer check.

Tool surface

Read:

Tool

Purpose

list_guilds

Guilds the bot is in

get_guild

Guild settings + full role list (permissions decoded to names)

list_channels

All channels incl. categories, overwrites decoded

list_roles

All roles, highest first

get_bot_info

Bot identity, guild count, 10-guild headroom

get_blueprint_template

Ready-made blueprints for common community types

Write:

Tool

Purpose

create_guild

POST /guilds -- whole structure in one request via a blueprint

apply_blueprint

The main tool: diff blueprint vs live state, apply the diff

create_role

One role; permissions as names, color as hex

create_channel

One channel/category, with optional overwrites

set_channel_permissions

Set (replace) one role/member overwrite on a channel

reorder_channels

Bulk channel positions / parents

reorder_roles

Bulk role positions

Destructive (gated -- both require confirm: true and say so in their descriptions; there is deliberately no delete_guild tool at all):

Tool

Purpose

delete_channel

Permanently delete a channel

delete_role

Permanently delete a role

Every tool returns structured JSON text. Failures return an MCP error result carrying the Discord error code, message, field details, and an actionable hint -- never a thrown exception that kills the process. Every write sends an X-Audit-Log-Reason header so actions are traceable in the guild's audit log.

Server design layer

The server ships opinionated design knowledge so assistants produce sensible layouts instead of inventing conventions per request:

  • Templates -- get_blueprint_template returns a complete starter blueprint for a community type: gaming, dev, support, or creator. Call it without arguments to list them. Each follows the conventions below (INFORMATION category first, locked info channels, Admin > Mod > status > Member ladder, private STAFF area, sane @everyone baseline).

  • Design guide -- the MCP resource discord://design-guide (markdown): category ordering, standard channels, role ladders, permission patterns, guild settings, and the dry-run-first workflow.

  • Prompt -- the MCP prompt design_server (arguments: community_type, requirements) bundles the guide plus the matching template into a single message, for clients with prompt support.

Typical flow: assistant lists templates, fetches the closest one, tailors names/roles/channels to the request, then runs apply_blueprint with dry_run: true for review before writing.

Blueprint format

A blueprint is a JSON object (the blueprint parameter also accepts a JSON string). YAML shown here for readability -- it maps 1:1 onto the JSON; if you author in YAML, convert it to JSON before passing it in (no YAML parser is bundled, by design, to keep dependencies thin).

name: "Example Server"
everyone_permissions: [VIEW_CHANNEL, READ_MESSAGE_HISTORY]
roles:
  - name: "Admin"
    color: "#e74c3c"
    hoist: true
    permissions: [ADMINISTRATOR]
  - name: "Member"
    permissions: [VIEW_CHANNEL, SEND_MESSAGES, READ_MESSAGE_HISTORY, ADD_REACTIONS]
categories:
  - name: "INFORMATION"
    private_to: []              # empty = public
    channels:
      - name: "announcements"
        type: announcement
        locked: true            # shorthand: @everyone denied SEND_MESSAGES
      - name: "rules"
        type: text
        locked: true
  - name: "STAFF"
    private_to: [Admin]         # shorthand: @everyone denied VIEW_CHANNEL, Admin allowed
    channels:
      - name: "staff-chat"
        type: text

Field reference

Root:

Field

Type

Notes

name

string (2-100)

Guild name (used by create_guild)

everyone_permissions

permission[]

Baseline permissions of the @everyone role

roles

role[]

Order = role list order, top first

categories

category[]

Order = category order

channels

channel[]

Top-level channels outside any category

icon

data URI

data:image/png;base64,... (create_guild only)

verification_level

0-4

Optional guild setting

default_message_notifications

0-1

Optional guild setting

explicit_content_filter

0-2

Optional guild setting

afk_timeout

60/300/900/1800/3600

Optional guild setting

system_channel

channel name

Must be a text/announcement channel defined here

afk_channel

channel name

Must be a voice channel defined here

Role: name (required), color (hex string), hoist, mentionable, permissions (array of permission names).

Category: name (required), private_to, locked, overwrites, channels.

Channel: name (required), type (text default, voice, announcement, stage, forum, media), topic, nsfw, rate_limit_per_user, locked, private_to, overwrites.

Overwrite (the escape hatch when shorthands are not enough):

overwrites:
  - role: "Member"          # a role name from roles[], or "@everyone"
    allow: [VIEW_CHANNEL]
    deny: [SEND_MESSAGES]

Permission names are the documented Discord constants (VIEW_CHANNEL, SEND_MESSAGES, MANAGE_ROLES, MODERATE_MEMBERS, ...). An unknown name fails validation with the full list of valid options. Bit positions are verified against the current Discord docs; bitfields are computed with BigInt and serialised as strings, never JavaScript numbers.

Semantics

  • Roles are referenced by name everywhere (in private_to and overwrites). Resolution to snowflake ids happens at apply time. A reference to a role not defined in roles[] is a validation error caught before any API call.

  • private_to: [RoleA] denies VIEW_CHANNEL for @everyone and allows it for each listed role -- the standard private-channel pattern. An empty array means public.

  • locked: true denies SEND_MESSAGES for @everyone.

  • Category inheritance. A child channel that states nothing overwrite-related inherits the category's overwrites exactly (the way Discord's UI syncs new channels to their category). A child that states anything merges with the category per role and per bit, and the child wins on conflicts. So locked: true inside a private category keeps the privacy and adds the lock, and an explicit overwrites: [{ role: "@everyone", allow: [VIEW_CHANNEL] }] can punch a public window into a private category.

  • Contradictions are errors. Allowing and denying the same permission for the same role at the same level fails validation.

  • Omitted fields are unmanaged. A role without permissions (or a channel without topic) is created with Discord defaults and never diffed, so reconcile will not fight manual changes to fields the blueprint does not mention. State a field to manage it.

  • Channel names are normalised the way Discord stores them: text-like channels become lowercase-kebab ("Staff Chat" -> staff-chat). Matching and idempotency use the normalised name. Duplicate normalised names within the same category are a validation error.

Planning, idempotency, orphans

apply_blueprint(guild_id, blueprint, mode, dry_run):

  1. Validates the blueprint (schema, role references, contradictions). This is a separate pass; nothing is fetched or written if it fails.

  2. Fetches live roles and channels.

  3. Matches blueprint entities to live entities by name and produces an ordered plan: @everyone permissions -> create roles -> update roles -> set role positions -> create categories -> create channels -> update channels -> apply overwrites.

  4. Skips anything that already matches; in reconcile mode updates anything that differs; in create_only mode (the default, the conservative choice) only creates what is missing and reports differing entities under skipped.

  5. Never deletes anything. Live roles/channels the blueprint does not mention are reported under orphans for you to decide about (the gated delete tools exist for that).

dry_run: true validates everything and returns the full ordered plan without a single write call. DRY_RUN=true in the environment forces this for every write tool in the server, with a second guard at the HTTP client level -- both are covered by tests.

Applying the same blueprint twice yields zero operations the second time (tested at both the planner and the full-tool level).

Overwrite management scope: on channels the blueprint defines, role-type overwrites for roles the blueprint knows about (and @everyone) are fully converged -- including removing ones the blueprint no longer wants. Member-type overwrites and overwrites for roles outside the blueprint are never touched.

If an apply fails partway (e.g. a permission error), it stops, reports what was applied and what failed, and re-running is safe -- the next run diffs from wherever things stand.

Rate limiting

Provisioning a server means dozens of rapid writes, so the client:

  • Tracks X-RateLimit-Bucket, X-RateLimit-Remaining, X-RateLimit-Reset-After, and serialises requests sharing a bucket.

  • On 429 reads retry_after from the JSON body and sleeps; a 429 with X-RateLimit-Scope: global pauses ALL requests, not just that bucket. Gives up after 10 consecutive 429s on one request.

  • Retries 5xx and network errors with jittered exponential backoff, max 5 attempts. Never retries any other 4xx.

  • Serialises ALL writes through a single queue with WRITE_DELAY_MS (default 250 ms) between them, because role/channel creation is limited far more aggressively than reads. Raise it if you still see 429s.

Error mapping

Discord's numeric code and nested errors field paths are surfaced on every failure, plus a hint for the common cases:

Code / status

Meaning

Hint

50001

Missing Access

Bot cannot see the guild/channel; check membership and VIEW_CHANNEL

50013

Missing Permissions

Bot lacks Manage Roles/Channels, or the target role is at/above the bot's top role

30013

Max guilds

The 10-guild bot creation limit; invite the bot to an existing server instead

30005 / 30011 / 30xxx

Resource limits

Role (250) / channel (500) / other Discord limits

50035

Invalid Form Body

Includes the exact field path(s) from Discord's response

401

Bad token

Re-copy DISCORD_BOT_TOKEN from the portal

403

Forbidden

Usually role hierarchy -- move the bot's role up

Development

npm run dev        # tsx, stdio mode
npm test           # vitest; the HTTP layer is stubbed, no network calls
npm run typecheck
npm run build

Decisions and assumptions

Choices made where the spec left room, leaning conservative:

  • apply_blueprint defaults to create_only; reconcile is opt-in.

  • Nothing is ever deleted by the blueprint path; orphans are reported only. Member-type overwrites and overwrites for non-blueprint roles are preserved even in reconcile.

  • Omitted blueprint fields (role permissions, channel topic, ...) are unmanaged rather than treated as "set to default".

  • Blueprint roles order defines the top-to-bottom role order. Reconcile fixes relative order; create_only never repositions existing roles. Existing channels are not repositioned by reconcile either (creation sets positions; use reorder_channels for manual fixes).

  • A live channel whose type differs from the blueprint's is reported as a conflict (Discord cannot convert most types); no action is taken.

  • Blueprints arrive as JSON (object or string). YAML is documentation-side only, to avoid another dependency.

  • 429s are retried up to 10 times per request; 5xx up to 5 attempts.

  • Apply stops at the first failed operation rather than continuing blind.

  • HTTP mode binds 127.0.0.1 unless --host says otherwise, and refuses to start without MCP_AUTH_TOKEN.

  • Bot-integration (managed) roles are never matched, updated, or listed as orphans.

Security notes

  • The bot token and MCP auth token are redacted from every log line as a last line of defense; they are never placed in tool output or error messages in the first place.

  • delete_channel / delete_role require confirm: true and are labelled irreversible; there is no delete_guild tool.

  • Prefer DRY_RUN=true plus apply_blueprint(dry_run: true) to review the plan before letting it write.

Available Tools

15 tools
apply_blueprintApply blueprintA

Diff a declarative blueprint against a guild's live roles and channels, then apply the difference in order (roles -> role positions -> categories -> channels -> permission overwrites). Nothing is ever deleted; live entities missing from the blueprint are reported as orphans. mode=create_only (default) only creates missing entities; mode=reconcile also updates entities that differ. With dry_run=true the full ordered plan is returned and no write reaches Discord. Applying the same blueprint twice yields zero operations the second time.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNocreate_only
dry_runNo
guild_idYes
blueprintYes

TDQS

A4.6/5.0
Behavior5/5

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

The description goes far beyond the annotations. It discloses that 'Nothing is ever deleted; live entities missing from the blueprint are reported as orphans,' explains the ordered application, states that dry_run prevents any write, and notes idempotency ('Applying the same blueprint twice yields zero operations the second time'). This is excellent 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.

Conciseness5/5

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

Three dense sentences, each earning its place. The most important information (diff and apply) is front-loaded, followed by safety guarantees, mode explanations, and idempotency. No filler or redundant phrasing.

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

Completeness4/5

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

Given the tool's complexity (nested blueprint, 4 params, no output schema), the description is remarkably complete. It covers behavior, modes, safety, dry_run, and idempotency. The only gap is that it doesn't describe the return value for non-dry-run executions, though dry_run's return is mentioned. This minor omission prevents a 5.

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?

With 0% schema description coverage, the description compensates by explaining mode and dry_run semantics in detail ('mode=create_only (default)', 'dry_run=true the full ordered plan is returned'). It implies the blueprint structure via the ordered application list. While it doesn't detail the blueprint's required fields, the schema itself contains extensive nested documentation, so this is a strong partial compensation.

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

Purpose5/5

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

The description starts with a specific verb and resource: 'Diff a declarative blueprint against a guild's live roles and channels, then apply the difference.' It clearly distinguishes the tool from the granular sibling tools (create_role, create_channel, etc.) by describing a bulk, ordered application process covering roles, categories, channels, and permission overwrites.

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 gives clear context on when to use the tool and its modes: 'mode=create_only (default) only creates missing entities; mode=reconcile also updates entities that differ.' It also mentions dry_run for planning. However, it does not explicitly state when not to use it or name alternatives, so it lacks explicit exclusion guidance.

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

create_channelCreate channelA

Create a channel (or category) in a guild. Overwrite permissions are given as permission names.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
nsfwNo
typeNotext
topicNo
guild_idYes
positionNo
parent_idNoCategory channel id to place this channel under
rate_limit_per_userNo
permission_overwritesNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate this is a write operation (readOnlyHint=false) and non-destructive. The description adds one useful behavioral note about permission overwrites being named as strings, but does not disclose other behavioral aspects like required permissions, creation side effects, or what happens to the channel after creation. With annotations present, this level of added context is acceptable but limited.

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

Conciseness5/5

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

The description is two short sentences, front-loaded with the core action and a key parameter note. No wasted words; every sentence adds value.

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

Completeness3/5

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

For a creation tool with 9 parameters and no output schema, the description is minimal. It covers the primary purpose and one important semantic detail but leaves out context about return value, prerequisites, permission requirements, or how different channel types behave. This is adequate but not comprehensive for a tool of this complexity.

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

Parameters3/5

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

Schema description coverage is only 11%, so the description carries a burden to clarify parameters. It adds meaning to the permission_overwrites structure by stating that permissions are given as names, which is helpful. However, it does not clarify the meaning of other less obvious parameters like position, rate_limit_per_user, or the type enum, leaving some gaps that the schema alone (with types/enums) partially fills.

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

Purpose5/5

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

The description states 'Create a channel (or category) in a guild' with a specific verb and resource, clearly distinguishing this from sibling tools like create_role or create_guild. It also mentions permission overwrites, adding key context about the tool's function beyond just the name.

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

Usage Guidelines4/5

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

The description clearly implies the tool is for creating channels (including categories) in a guild, which is the correct context. It does not explicitly mention when not to use it or name alternatives, but the verb and resource make the intended use obvious among the sibling tools.

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

create_guildCreate guildA

Create a new guild (server) owned by the bot, optionally provisioning the entire structure (roles, categories, channels, permission overwrites) from a blueprint in a single request. Only works while the bot is in fewer than 10 guilds; otherwise create the server manually, invite the bot, and use apply_blueprint.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
blueprintNoOptional blueprint; its name field is overridden by the name parameter

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only provide readOnlyHint=false and destructiveHint=false, so the description carries the transparency burden. It discloses key behaviors: guild is bot-owned, blueprint provisioning in a single request, and the 10-guild limit. However, it does not mention potential partial failures or what happens if the blueprint is invalid, which would be 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?

The description is three sentences, front-loaded with the core purpose, and each sentence adds necessary information. There is no redundancy or fluff, making it highly concise and structured.

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

Completeness4/5

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

Given the tool's complexity (nested blueprint objects, no output schema, minimal annotations), the description covers the primary use case, the limiting condition, and the fallback path. It lacks information about return values or failure handling, but the overview is sufficient for basic selection. The exclusion of apply_blueprint is correctly highlighted.

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%, so the description should compensate. The description explains the blueprint parameter's purpose (provisioning roles, categories, channels, permission overwrites), which adds meaning beyond the schema. However, the required 'name' parameter is not given additional context, and the description does not clarify parameter interactions (e.g., that blueprint.name is overridden).

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

Purpose5/5

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

The description clearly states the tool creates a new guild owned by the bot, with an optional blueprint for full structure provisioning. It distinguishes itself from apply_blueprint by focusing on new guild creation, and mentions the 'owned by the bot' aspect that is unique to this tool.

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?

The description explicitly provides a usage condition ('Only works while the bot is in fewer than 10 guilds') and a clear alternative path ('otherwise create the server manually, invite the bot, and use apply_blueprint'). This gives excellent guidance on when to use this tool versus the sibling apply_blueprint.

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

create_roleCreate roleA

Create a role in a guild. Permissions are given as permission names (e.g. VIEW_CHANNEL, SEND_MESSAGES), never raw bitfields.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
colorNo
hoistNo
guild_idYes
positionNoDesired position; higher = higher in the role list
mentionableNo
permissionsNoPermission names, e.g. ["VIEW_CHANNEL", "SEND_MESSAGES"]

TDQS

A4.1/5.0
Behavior4/5

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

Annotations indicate a write operation that is not destructive. The description adds useful behavioral context by specifying the permission format ('never raw bitfields'), which is beyond the schema. It does not disclose other side effects or prerequisites, but given the annotations, the safety profile is established.

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

Conciseness5/5

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

The description is two concise sentences. The primary action is front-loaded, and the permission note adds essential detail without unnecessary fluff.

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?

Given the tool has 7 parameters and no output schema, the description is relatively brief. It does not explain return values or failure modes, but the annotations cover the safety profile. The permission guideline is helpful, yet the lack of documentation for several parameters and no output schema means the agent may still face ambiguity in invoking the tool correctly.

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

Parameters3/5

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

The description directly clarifies the 'permissions' parameter by explaining it expects permission names and explicitly warns against raw bitfields, adding value over the schema's minimal description. However, other parameters like 'color', 'hoist', and 'mentionable' are left unexplained, and with schema coverage at 29%, the description only partially compensates.

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

Purpose5/5

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

The description clearly states the tool's function with a specific verb ('Create') and resource ('role in a guild'), distinguishing it from sibling tools like create_guild or create_channel. The scope is unambiguous.

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

Usage Guidelines4/5

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

The description provides clear context ('in a guild') and a specific operational guideline (permissions as names, not bitfields), which helps the agent format inputs correctly. However, it does not explicitly state when to prefer this tool over alternatives or when not to use it, so it stops short of full guidance.

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

delete_channelDelete channel (IRREVERSIBLE)A
Destructive

Permanently delete a channel or category. THIS IS IRREVERSIBLE: all messages in the channel are lost and cannot be restored. Requires confirm=true as an explicit acknowledgement.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. Confirms you understand this is irreversible.
channel_idYes

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds significant value by explicitly stating 'THIS IS IRREVERSIBLE: all messages in the channel are lost and cannot be restored' and requiring confirm=true. This goes beyond the annotations and is directly relevant to the agent's decision-making.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core action 'Permanently delete'. It uses concise, high-impact warnings without fluff. Every sentence serves a purpose: stating the action and emphasizing irreversibility/acknowledgement.

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

Completeness4/5

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

The tool is simple with two parameters and no output schema. The description covers the action, irreversibility, and confirm requirement. It does not mention what happens to child channels when deleting a category, but this is not essential for basic usage. The annotations plus description are sufficient for a destructive operation.

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% (only confirm is described). The description reinforces the confirm parameter's meaning and necessity. However, channel_id lacks a description in both schema and description, though its purpose is inferable from the tool name and pattern. The description does not fully compensate for the missing channel_id semantics.

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

Purpose5/5

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

The description clearly states 'Permanently delete a channel or category' – a specific verb and resource. It distinguishes itself from sibling tools like delete_role and reorder_channels by naming the exact action and target.

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 when to use the tool ('when you need to permanently delete a channel/category') but does not explicitly mention alternatives or when not to use it. The warning about irreversibility and confirm flag provides some usage context, but not direct sibling differentiation.

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

delete_roleDelete role (IRREVERSIBLE)A
Destructive

Permanently delete a role from a guild. THIS IS IRREVERSIBLE: the role is removed from every member and every permission overwrite. Requires confirm=true as an explicit acknowledgement.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. Confirms you understand this is irreversible.
role_idYes
guild_idYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description details the irreversible consequences: the role is removed from every member and every permission overwrite. It also requires confirm=true, which adds important behavioral context about an extra safety gate.

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

Conciseness5/5

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

The description is two sentences long and front-loaded with the core action. Every sentence contributes critical information: the permanent deletion and the irreversibility/confirm requirement. There is no filler or 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 destructive tool with no output schema, the description covers the essential operational facts: what happens (permanent deletion), scope (members and permission overwrites), and required flag (confirm=true). It doesn't mention required permissions or the return value, but the given context is sufficient for correct invocation in most scenarios.

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

Parameters3/5

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

The description adds meaning for the confirm parameter by requiring it to be true, which complements the schema's existing description. However, it provides no additional explanation for guild_id and role_id—only the schema's patterns exist, and the description doesn't state what these IDs reference. With only 33% schema description coverage, the description only partially compensates.

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

Purpose5/5

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

The description uses a specific verb+resource construction: 'Permanently delete a role from a guild.' This clearly distinguishes it from sibling tools like create_role and delete_channel while making the action and target 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?

The description explicitly states that confirm=true is required as an explicit acknowledgement, providing a direct usage condition. It also implies the appropriate context by calling out irreversibility, though it doesn't explicitly contrast with alternatives or mention when not to use it.

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

get_blueprint_templateGet blueprint templateA
Read-only

Get a ready-made server blueprint for a common community type (gaming, dev, support, creator) to use as a starting point for apply_blueprint or create_guild -- rename and adjust instead of designing from zero. Call without arguments to list the available templates. The design conventions behind them live in the discord://design-guide resource.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoTemplate kind (gaming | dev | support | creator). Omit to list all.

TDQS

A4.2/5.0
Behavior4/5

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

With readOnlyHint=true, the safety profile is already clear. The description adds valuable behavioral context: calling without arguments lists templates, and the design conventions are referenced via the discord://design-guide resource. It does not describe the return format, but for a simple read operation this is sufficient.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, and contains zero wasted words. It efficiently conveys what, why, and how to invoke the tool.

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 single-parameter read tool with no output schema, the description covers the essential aspects: what it returns (a ready-made blueprint), how to use it (as a starting point for apply_blueprint/create_guild), and the optional no-argument behavior. It even points to a design-guide resource for deeper conventions. While return format is not specified, the tool's simplicity and the presence of readOnlyHint mitigate that 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 description coverage is 100% and the schema already documents the 'kind' parameter with its allowed values and the omit-to-list-all behavior. The description reinforces the kinds and the omit behavior but does not add meaning beyond the schema, so the baseline score 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?

The description clearly states the tool's purpose: 'Get a ready-made server blueprint for a common community type (gaming, dev, support, creator) to use as a starting point for apply_blueprint or create_guild.' It uses a specific verb (get), names the resource (blueprint template), and explicitly distinguishes it from the sibling tools apply_blueprint and create_guild by noting they consume the template.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool: 'to use as a starting point for apply_blueprint or create_guild -- rename and adjust instead of designing from zero.' It also explains the no-argument call to list templates. It does not explicitly exclude other alternatives, but the downstream references and sibling tools imply the intended workflow.

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

get_bot_infoGet bot infoA
Read-only

Show the bot's identity, how many guilds it is in, and whether it is still under the 10-guild limit that gates guild creation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

The readOnlyHint annotation establishes that this is a safe read operation, and the description adds beyond that by detailing the specific data points returned (identity, guild count, limit check). This gives the agent a concrete understanding of what the tool will provide, going beyond the mere 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?

The description is a single, compact sentence that front-loads the core purpose ('Show the bot's identity') and includes all necessary detail without redundancy. Every clause adds value, making it highly concise and well-structured.

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

Completeness5/5

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

Given the tool's simplicity (no parameters, no output schema, clear read-only nature), the description fully covers the necessary context. It specifies exactly what the tool returns, including the nuanced 10-guild limit check, which is important for understanding the tool's role in the broader workflow. Nothing essential 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?

The tool takes zero parameters, and the schema reflects this with 100% coverage. The baseline for no parameters is 4, and the description doesn't need to add parameter semantics since there are none. It usefully implies the tool operates on the bot itself, but no further parameter detail is required.

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

Purpose5/5

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

The description explicitly states the specific verb ('Show') and resource ('bot'), listing exactly what information is returned: identity, guild count, and the 10-guild limit. This clearly distinguishes it from sibling tools like get_guild or list_guilds, which focus on guild-level data rather than bot-level status.

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

Usage Guidelines4/5

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

The description clearly communicates the context for using this tool: when you need bot identity, guild count, or the 10-guild limit status. While it doesn't explicitly name alternatives or exclusions, the purpose is self-evident and distinct from sibling tools, providing clear context without needing further elaboration.

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

get_guildGet guildA
Read-only

Fetch a guild's settings and full role list (with permission bitfields decoded to names).

ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description adds a useful behavioral detail: role permission bitfields are decoded to names. This goes beyond the annotation and helps set expectations for the return value.

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?

Single sentence, direct, no filler. Front-loaded with the action and resource, and every word adds value.

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

Completeness4/5

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

The tool has one parameter and read-only annotation. The description covers what it returns, including a notable decoding behavior, which is sufficient for a simple fetch endpoint.

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

Parameters2/5

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

The schema has no descriptions (0% coverage), and the description does not explain the guild_id parameter or its format. The parameter name is self-evident, but the description adds no semantic value beyond the 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?

The description clearly states the tool fetches a guild's settings and full role list, with a specific verb and resource. It distinguishes from siblings like list_guilds and list_roles by combining settings and roles in one call.

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 the tool is for retrieving guild settings and roles, but does not explicitly state when to prefer it over list_roles or list_guilds, nor does it provide any exclusions or alternative guidance.

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

list_channelsList channelsA
Read-only

List every channel in a guild, including categories, with permission overwrites decoded to permission names.

ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idYes

TDQS

A4.3/5.0
Behavior4/5

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

The readOnlyHint annotation already covers the safety profile, and the description adds meaningful behavioral detail: channels are listed including categories, and permission overwrites are decoded to permission names. This goes beyond the annotation without contradicting 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?

The description is a single, front-loaded sentence that immediately states the action and scope, followed by useful detail. Every word earns its place, with no redundancy or filler.

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?

The tool is simple: one parameter, read-only, no output schema. The description fully conveys the tool's purpose and key output characteristics (includes categories, decoded permissions), which is sufficient for an agent to invoke it correctly.

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

Parameters3/5

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

With 0% schema description coverage, the description partially compensates by stating 'in a guild,' which implies guild_id selects the target guild. However, it does not explicitly describe the lone parameter or its format, relying on the schema's pattern and the parameter name for full clarity.

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

Purpose5/5

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

The description clearly states the verb 'List' and the resource 'every channel in a guild,' explicitly including categories and decoded permission overwrites. This distinguishes it from siblings like list_guilds, list_roles, and get_guild by specifying exactly what is listed and in what scope.

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

Usage Guidelines4/5

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

The description provides clear context: use this when you need the full channel list for a specific guild, including categories and permission details. It does not explicitly mention alternatives or exclusions, so it stops short of a 5, but the context is unambiguous.

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

list_guildsList guildsA
Read-only

List every guild (server) the bot is currently a member of.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description consistently describes a read-only listing operation. It adds the useful detail that the result is limited to guilds the bot is currently a member of, but does not disclose any other behavioral traits such as ordering or pagination.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that conveys the essential information with no filler. Every word earns its place.

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

Completeness4/5

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

For a simple zero-parameter list tool, the description provides sufficient context: it names the operation, the resource, and the scope. It does not explain the return format, but given the simplicity and lack of an output schema, the description is reasonably complete.

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?

With zero parameters and 100% schema coverage (empty schema), there is nothing for the description to add. The baseline for 0 params is 4, and the description appropriately does not introduce any unnecessary 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?

The description uses the specific verb 'List' with the resource 'every guild (server)' and adds the scope 'the bot is currently a member of,' which clearly differentiates it from siblings like get_guild (specific guild) and list_channels/list_roles (other resources).

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

Usage Guidelines4/5

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

The description clearly implies when to use this tool (when you need all guilds the bot is in) without ambiguity. It does not explicitly mention alternatives or exclusions, but the context is unmistakable given the zero-parameter schema.

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

list_rolesList rolesA
Read-only

List every role in a guild, highest first, with permission bitfields decoded to names.

ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idYes

TDQS

A4.2/5.0
Behavior4/5

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

The readOnlyHint annotation already declares the operation is read-only. The description adds valuable behavioral details beyond that: sorting order (highest first) and that permission bitfields are decoded to names, which informs the agent about the output format and processing.

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

Conciseness5/5

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

The description is a single, well-structured sentence that front-loads the core action and adds useful details without any redundant wording. Every clause contributes meaningful 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?

Given the simplicity of the tool (one parameter, read-only, no output schema), the description is adequately informative. It covers the scope, ordering, and a key output transformation. It does not mention potential edge cases like the @everyone role or pagination, but these are not critical for understanding the tool's function in this context.

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

Parameters3/5

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

The schema has zero coverage for parameter descriptions, so the description must compensate. It mentions 'in a guild,' implying the guild_id parameter, but does not elaborate on its format or validate against the pattern. The parameter name is fairly self-explanatory, but the description does not fully bridge the gap left by missing schema descriptions.

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

Purpose5/5

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

The description states the exact action ('List every role in a guild'), specifies the order ('highest first'), and describes the output enrichment ('permission bitfields decoded to names'). This clearly distinguishes it from sibling tools like list_channels or get_guild.

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 context is clear: use this tool when you need a complete list of roles within a specific guild. However, it does not explicitly mention alternatives or when not to use it, but the purpose is self-evident from the description and tool name.

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

reorder_channelsReorder channelsA

Change the positions (and optionally the parent category) of multiple channels in one request. Positions are relative within each channel group (categories, text-like, voice).

ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idYes
positionsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate this is a non-read-only, non-destructive operation. The description adds behavioral nuance about relative positioning within channel groups and the optional parent category change, which goes beyond the annotations. It does not contradict 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.

Conciseness5/5

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

The description is two sentences long, front-loaded with the primary action, and every word adds value. No fluff or 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?

The tool is a mutating batch operation with a complex array parameter and no output schema. The description covers the core semantics and adds the important grouping rule, but it omits details like permission requirements or atomicity guarantees. Still, given the schema and annotations, it is reasonably 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 description coverage is 0% for top-level parameters, so the description must compensate. It mentions 'positions' and 'parent category' but does not explicitly break down the array structure (channel_id, position, parent_id, lock_permissions). The schema itself provides some nested descriptions, but the description adds only partial semantic value, resulting in a 3.

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

Purpose5/5

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

The description clearly states the action: 'Change the positions (and optionally the parent category) of multiple channels in one request.' This is a specific verb and resource, and it distinguishes itself from sibling tools like reorder_roles and 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 provides clear context by noting 'in one request' and clarifying that positions are relative within channel groups. It implies this is for batch reordering, but it does not explicitly name alternatives or state when not to use this tool. Thus, it earns a 4.

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

reorder_rolesReorder rolesA

Change the positions of multiple roles in one request. Higher position = higher in the role list. The bot can only move roles below its own highest role.

ParametersJSON Schema
NameRequiredDescriptionDefault
guild_idYes
positionsYes

TDQS

A4.2/5.0
Behavior4/5

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

The description adds valuable behavioral details beyond the annotations: it explains how positions map to hierarchy and discloses the bot's permission boundary (can only move roles below its own highest role). This is useful context that annotations do not provide, and there is no contradiction with readOnlyHint=false or destructiveHint=false.

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

Conciseness5/5

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

The description is only two sentences, with the action stated first and the key behavioral nuances following immediately. It is concise, front-loaded, and every word adds value with no extraneous detail.

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 tool with two parameters, the description covers the essential behavior: batch reordering, position semantics, and the bot's permission constraint. It does not describe failure modes or return values, but given there is no output schema and the tool is straightforward, the description is sufficiently complete.

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

Parameters3/5

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

The input schema has no descriptions for its parameters, and the description partially compensates by clarifying the meaning of 'position' (higher = higher in list) and the bot's limitation. However, it does not explain the structure of the positions array (each item requires role_id and position) or whether positions are absolute or relative, leaving some ambiguity. The schema already defines the structure, so the added value is moderate.

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

Purpose5/5

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

The description clearly states the action: 'Change the positions of multiple roles in one request.' This is a specific verb with a clear resource (role positions) and scope (multiple roles, one request). It distinguishes from siblings like reorder_channels by focusing on roles, even though it doesn't explicitly name them.

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

Usage Guidelines4/5

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

The description provides useful context for when to use the tool, including the effect ('Higher position = higher in the role list') and the critical limitation ('The bot can only move roles below its own highest role'). However, it does not explicitly state alternatives or exclusions, such as when to use reorder_channels instead, so it stops short of full guidance.

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

set_channel_permissionsSet channel permissionsA

Set the permission overwrite for a role or member on a channel. REPLACES any existing overwrite for that target on that channel. The standard private-channel pattern: deny VIEW_CHANNEL for the guild's @everyone role (target_id = guild id, target_type = role) and allow VIEW_CHANNEL for the roles that should see it.

ParametersJSON Schema
NameRequiredDescriptionDefault
denyNo
allowNo
target_idYesRole id or member id. The @everyone role id equals the guild id.
channel_idYes
target_typeYes

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses a critical behavioral trait—that the operation REPLACES any existing overwrite—which goes beyond the annotations. It also clarifies the relationship between target_id and the @everyone role. However, it does not mention required permissions or return behavior.

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

Conciseness5/5

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

The description is three concise sentences: the primary action, the replacement warning, and a practical pattern. It is front-loaded and contains no fluff or repetition.

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 mutation tool with no output schema, the description covers the essential behavior (replacing overwrites) and a common use case. It could be more exhaustive about available permission names and the effect of omitting allow/deny, but it is sufficient for an agent to understand the core functionality and invoke the tool correctly in many scenarios.

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?

With only 20% schema coverage, the description compensates by explaining how target_id and target_type work together for the @everyone role and by giving an example of deny/allow values (VIEW_CHANNEL). It clarifies the practical use of the parameters even though it does not individually describe each field.

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

Purpose5/5

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

The description clearly states it sets a permission overwrite for a role or member on a channel, using a specific verb and resource. It also explicitly mentions that it REPLACES existing overwrites, which distinguishes it from sibling tools like create_role or delete_channel.

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

Usage Guidelines4/5

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

It provides a concrete, actionable pattern for creating private channels by denying VIEW_CHANNEL to @everyone and allowing it for specific roles. While it does not explicitly discuss when not to use the tool or name alternatives, there is no direct sibling tool for permissions, so the guidance is adequate.

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

TDQS

A4.4/5.0
Disambiguation5/5

Every tool targets a distinct resource-action pair (e.g., list_guilds vs. get_guild, create_role vs. create_channel). The only potential overlap, create_guild vs. apply_blueprint, is clearly separated by one being for new guilds and the other for existing guilds.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (list_, get_, create_, apply_, set_, reorder_, delete_). There is no mixing of conventions or vague verbs.

Tool Count5/5

With 15 tools, the set is well-scoped for the purpose of Discord server provisioning. Each tool covers a specific aspect of guild, role, channel, and permission management, with no redundant or unnecessary additions.

Completeness5/5

The tool surface provides a comprehensive lifecycle for roles, channels, and permissions, including listing, creating, reordering, and deleting, with updates handled via apply_blueprint's reconcile mode. Guild creation and blueprint management are also covered, leaving no obvious gaps.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A Discord MCP server that gives AI agents full control of a Discord bot — messages, channels, roles, threads, forums, events, webhooks, reactions, moderation, image generation, and real-time voice.
    74
    6
    MIT
  • F
    license
    C
    quality
    C
    maintenance
    An MCP server that exposes Discord bot actions as tools for LLM clients.
    29
    1
  • A
    license
    B
    quality
    B
    maintenance
    Local MCP server for inspecting and managing an allowlisted Discord server via Discord's REST API, with safety modes, idempotent JSON blueprints, and destructive-operation safeguards.
    27
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TinyGecko920/discord-mcp'

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