Declares who you are, what version this is, and what you're allowed to do. id, name and version are required. id must match the plugin you created in the Dev Portal (3–32 chars: lowercase letters, digits and underscores, starting with a letter); version is assigned by the platform on upload and your manifest's version is stamped to match — zip uploads and GitHub pulls alike, so you never need to bump it by hand. Minimum viable manifest:
{
"id": "my_plugin",
"name": "My Plugin",
"version": "1.0.0",
"description": "Pongs whenever someone types !ping.",
"capabilities_required": [
"discord:send_message",
"events:message_content"
]
}
Optional fields:
| Field | Purpose |
|---|---|
| capabilities_required | Capabilities you request; server admins choose which to grant at install time. A call that needs an ungranted capability raises CapabilityError at runtime, so handle it or keep your ask minimal. Capabilities your code uses but you forgot to declare are auto-added at upload with a warning. See the capability catalog. |
| slash_commands | Discord slash commands the platform should register on your behalf. See Slash commands. Declaring this auto-adds interaction:respond to capabilities_required, and @plugin.on_slash_command handlers with no manifest entry are auto-merged in at upload. |
| proxy_domains_requested | Allow-list of hostnames you'll reach through ctx.http.* (subdomains included) and ctx.ws (exact host required, no wildcard). The upload pipeline auto-detects domains from literal "https://…" URLs in your source; this field is your final review. Non-empty values auto-add proxy:http; ctx.ws.* usage auto-adds proxy:websocket. |
Listing metadata (byline, icon, tags, screenshots) is edited on your Dev Portal listing page, not in manifest.json.