Skip to main content
Glama
Discord MCP - Discord server management MCP for AI agents

Discord MCP - Discord server management MCP for AI agents

Execute build plan

execute_build_plan
Destructive

Execute a staged Discord server build plan or add a blueprint in dependency order, stopping and reporting exactly what succeeded, failed, or remains; changing builds return an undoable change ID.

Instructions

Execute a staged plan by plan_id, or pass a blueprint directly to build it additively. A plan that changes existing items runs exactly as staged or not at all: it is checked against the server again and refused if anything it would touch has changed since. Building goes in dependency order: roles, then categories, then channels, creating before changing. If a step fails, the run stops and the report says exactly what was created, changed, failed, and never attempted; plan again to finish. Afterwards the server is compared with the blueprint and anything that did not take effect is reported. A build that changes anything returns a change_id that undo_change reverses.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "execute_build_plan"
  }
}

Input Schema

NameRequiredDescriptionDefault
guildNoGuild (server) name or ID. Omit to use the default guild.
plan_idNoA plan staged by plan_server_build.
blueprintNoBuild this blueprint directly, skipping the staging step. Only adds; never changes existing items. Refused when the blueprint gives @everyone or an existing role powers in a new channel: stage that with plan_server_build.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed27 schema fields changedv1.4.2
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • changedInput schema / properties / blueprint / description
      Previous value: -"Build this blueprint directly, skipping the staging step."New value: +"Build this blueprint directly, skipping the staging step. Only adds; never changes existing items. Refused when the blueprint gives @everyone or an existing role powers in a new channel: stage that with plan_server_build."
    • addedInput schema / properties / blueprint / properties / categories / items / properties / channels / items / properties / id
      Added value: +{
      +  "description": "Discord id from export_server_blueprint. Matches this exact item, so a new name renames it.",
      +  "pattern": "^\\d{17,20}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / blueprint / properties / categories / items / properties / channels / items / properties / permissions
      Added value: +{
      +  "description": "Extra permissions per role here, beyond who can see and post (private_to, read_only, posting_roles). Example: [{\"role\": \"Event Staff\", \"allow\": [\"mention_everyone\", \"embed_links\"]}]. A listed role's extras become exactly these; roles not listed keep theirs.",
      +  "items": {
      +    "properties": {
      +      "allow": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "deny": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "role": {
      +        "description": "Role name, or @everyone.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "role"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • changedInput schema / properties / blueprint / properties / categories / items / properties / channels / items / properties / posting_roles / description
      Previous value: -"With read_only: role names that may still post."New value: +"With read_only: role names that may still post and start threads."
    • addedInput schema / properties / blueprint / properties / categories / items / properties / channels / items / properties / private_to / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / blueprint / properties / categories / items / properties / channels / items / properties / private_to / description
      Previous value: -"Role names that can see this channel. Everyone else is denied view."New value: +"Role names that can see this channel; everyone else is denied view. [] leaves only admins. null makes it visible to everyone. Omit to follow the category."
    • removedInput schema / properties / blueprint / properties / categories / items / properties / channels / items / properties / private_to / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / blueprint / properties / categories / items / properties / channels / items / properties / private_to / type
      Removed value: -"array"
    • addedInput schema / properties / blueprint / properties / categories / items / properties / id
      Added value: +{
      +  "description": "Discord id from export_server_blueprint. Matches this exact item, so a new name renames it.",
      +  "pattern": "^\\d{17,20}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / blueprint / properties / categories / items / properties / permissions
      Added value: +{
      +  "description": "Extra permissions per role here, beyond who can see and post (private_to, read_only, posting_roles). Example: [{\"role\": \"Event Staff\", \"allow\": [\"mention_everyone\", \"embed_links\"]}]. A listed role's extras become exactly these; roles not listed keep theirs.",
      +  "items": {
      +    "properties": {
      +      "allow": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "deny": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "role": {
      +        "description": "Role name, or @everyone.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "role"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • addedInput schema / properties / blueprint / properties / categories / items / properties / private_to / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / blueprint / properties / categories / items / properties / private_to / description
      Previous value: -"Role names that can see the whole category."New value: +"Role names that can see the whole category. [] leaves only admins. null makes it visible to everyone."
    • removedInput schema / properties / blueprint / properties / categories / items / properties / private_to / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / blueprint / properties / categories / items / properties / private_to / type
      Removed value: -"array"
    • addedInput schema / properties / blueprint / properties / channels / items / properties / id
      Added value: +{
      +  "description": "Discord id from export_server_blueprint. Matches this exact item, so a new name renames it.",
      +  "pattern": "^\\d{17,20}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / blueprint / properties / channels / items / properties / permissions
      Added value: +{
      +  "description": "Extra permissions per role here, beyond who can see and post (private_to, read_only, posting_roles). Example: [{\"role\": \"Event Staff\", \"allow\": [\"mention_everyone\", \"embed_links\"]}]. A listed role's extras become exactly these; roles not listed keep theirs.",
      +  "items": {
      +    "properties": {
      +      "allow": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "deny": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "role": {
      +        "description": "Role name, or @everyone.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "role"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • changedInput schema / properties / blueprint / properties / channels / items / properties / posting_roles / description
      Previous value: -"With read_only: role names that may still post."New value: +"With read_only: role names that may still post and start threads."
    • addedInput schema / properties / blueprint / properties / channels / items / properties / private_to / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / blueprint / properties / channels / items / properties / private_to / description
      Previous value: -"Role names that can see this channel. Everyone else is denied view."New value: +"Role names that can see this channel; everyone else is denied view. [] leaves only admins. null makes it visible to everyone. Omit to follow the category."
    • removedInput schema / properties / blueprint / properties / channels / items / properties / private_to / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / blueprint / properties / channels / items / properties / private_to / type
      Removed value: -"array"
    • addedInput schema / properties / blueprint / properties / roles / items / properties / color / anyOf
      Added value: +[
      +  {
      +    "pattern": "^#?[0-9a-fA-F]{6}$",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / blueprint / properties / roles / items / properties / color / description
      Added value: +"null clears it."
    • removedInput schema / properties / blueprint / properties / roles / items / properties / color / pattern
      Removed value: -"^#?[0-9a-fA-F]{6}$"
    • removedInput schema / properties / blueprint / properties / roles / items / properties / color / type
      Removed value: -"string"
    • addedInput schema / properties / blueprint / properties / roles / items / properties / id
      Added value: +{
      +  "description": "Discord id from export_server_blueprint. Matches this exact item, so a new name renames it.",
      +  "pattern": "^\\d{17,20}$",
      +  "type": "string"
      +}
  2. Changed3 schema fields changedv1.4.0
    • changedInput schema / properties / blueprint / properties / channels / maxItems
      Previous value: -100New value: +500
    • addedInput schema / properties / blueprint / properties / roles / description
      Added value: +"Highest role first, the way the server settings list them. A build creates them in this order and that order is the hierarchy."
    • changedInput schema / properties / blueprint / properties / roles / maxItems
      Previous value: -50New value: +250
  3. Changed9 schema fields changedv1.3.0
    • removedInput schema / additionalProperties
      Removed value: -false
    • removedInput schema / properties / blueprint / additionalProperties
      Removed value: -false
    • removedInput schema / properties / blueprint / properties / categories / items / additionalProperties
      Removed value: -false
    • removedInput schema / properties / blueprint / properties / categories / items / properties / channels / items / additionalProperties
      Removed value: -false
    • removedInput schema / properties / blueprint / properties / channels / items / $ref
      Removed value: -"#/properties/blueprint/properties/categories/items/properties/channels/items"
    • addedInput schema / properties / blueprint / properties / channels / items / properties
      Added value: +{
      +  "name": {
      +    "maxLength": 100,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "nsfw": {
      +    "type": "boolean"
      +  },
      +  "posting_roles": {
      +    "description": "With read_only: role names that may still post.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "private_to": {
      +    "description": "Role names that can see this channel. Everyone else is denied view.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "read_only": {
      +    "description": "Deny sending for everyone; for rules and announcements.",
      +    "type": "boolean"
      +  },
      +  "slowmode_seconds": {
      +    "maximum": 21600,
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  "topic": {
      +    "maxLength": 1024,
      +    "type": "string"
      +  },
      +  "type": {
      +    "description": "Default text.",
      +    "enum": [
      +      "text",
      +      "voice",
      +      "forum",
      +      "stage",
      +      "announcement"
      +    ],
      +    "type": "string"
      +  }
      +}
    • addedInput schema / properties / blueprint / properties / channels / items / required
      Added value: +[
      +  "name"
      +]
    • addedInput schema / properties / blueprint / properties / channels / items / type
      Added value: +"object"
    • removedInput schema / properties / blueprint / properties / roles / items / additionalProperties
      Removed value: -false
  4. First observedv1.0.2

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the risk profile is largely covered by structured data. The description adds real context beyond that: re-validation against the server before touching anything, all-or-nothing semantics for mutating plans, dependency ordering, fail-fast with a partial report, and a change_id for reversal. It does not contradict the annotations, though the added value is somewhat less than it first appears given what the hints already signal.

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 two invocation modes, then progressive detail on validation, ordering, failure, and reversal. The sentences are dense and information-rich, though the final three clauses on failure reporting and post-verification could be tightened without losing much.

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 tool with a deeply nested blueprint object and no output schema, the description covers the execution contract well: validation, ordering, failure behavior, and the change_id return. It does not describe the shape of the failure report beyond naming its categories, which is a minor gap given there is no output schema to fall back on.

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

Parameters5/5

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

Schema coverage is 100% and every parameter carries its own description, so the schema already does the heavy lifting and a baseline of 3 would apply. The description still earns credit above that: it clarifies that plan_id must come from plan_server_build, that blueprint builds are additive only, and that the blueprint path is refused under specific permission conditions, which is behavioral meaning the schema does not encode.

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 ('Execute a staged plan') and names two distinct invocation modes (plan_id vs. inline blueprint) plus the additive-only constraint on the blueprint path. This is clearly separable from plan_server_build, which stages rather than executes.

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 routes between alternatives: use plan_id for something staged by plan_server_build, pass a blueprint to skip staging, and stage with plan_server_build instead when the blueprint grants @everyone or an existing role powers in a new channel. It also names undo_change as the reversal path, so when-to-use and when-not-to-use are both covered.

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

Deploy Server

Other Tools