Guildora
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DISCORD_TOKEN | Yes | Bot token from Discord Developer Portal (Bot > Reset Token). | |
| GUILDORA_HOST | No | HTTP bind address. | 127.0.0.1 |
| GUILDORA_PORT | No | HTTP port. | 8085 |
| GUILDORA_PACKS | No | Comma-separated list of packs to enable; use 'all' to enable everything. | core |
| DISCORD_GUILD_ID | No | Default Discord server ID, so tools may omit the guild. Not needed if the bot is in one server. | |
| GUILDORA_LOG_LEVEL | No | Log level: 'error', 'warn', 'info' or 'debug'. Logs go to stderr only. | info |
| GUILDORA_READ_ONLY | No | Set to 'true' to expose only non-mutating tools. | false |
| GUILDORA_TRANSPORT | No | Transport mode: 'stdio' or 'http'. | stdio |
| GUILDORA_HTTP_TOKEN | No | Require 'Authorization: Bearer <token>' over HTTP. Must be at least 16 characters. | |
| GUILDORA_SCAN_LIMIT | No | Max messages scanned when Discord's server search is unavailable (100-10000). | 1000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Guildora manages a Discord server through a bot. Channel, role, member, category and emoji arguments accept an ID, a mention (<#id>, <@&id>, <@id>) or a name; ambiguous names return the candidates. Destructive tools (delete, kick, ban, bulk delete) return a dry run unless called with "confirm": true. Show the dry run to the user before confirming. Lists are paginated: pass next_cursor back as "cursor" to get more. Enabled packs: core. Other packs (channels, roles, moderation, threads, voice, webhooks, invites, emoji, insights) are off; the user can enable them with GUILDORA_PACKS.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_server_infoA | Overview of a Discord server: owner, member count, boost tier, channel/role/emoji counts, the bot's permissions and which privileged intents are on. Call this first to orient yourself. If the bot is in several servers and none is the default, the error lists them. |
| list_channelsA | Lists server channels in sidebar order (categories with their channels), with IDs and types. Filter by type, category or a name fragment; type "thread" lists active threads (archived ones: list_threads). Use get_channel for details of one channel. |
| get_channelA | Details of one channel, category, thread or forum post: topic, category, slowmode, voice settings and who is connected, forum tags, thread state, and which key permissions the bot lacks there. Works for archived threads by ID or link. |
| list_rolesA | Lists server roles from highest to lowest with ID, position, color, flags and notable permissions. Marks the bot's highest role: the bot can only manage roles below it. |
| list_membersA | Lists server members with IDs, roles and join date. With "query", searches usernames and nicknames that start with the text (no special intent needed). Without a query it pages through all members, which needs the Server Members intent. "role" keeps only members with that role. Use get_member for one member. |
| get_memberA | Full details of one server member: names, account and join dates, all roles, timeout, voice channel, boosting, key permissions, and whether the bot can kick/ban/timeout them (role hierarchy). |
| read_messagesA | Reads recent messages from a channel, thread, forum post or DM, shown oldest first with IDs, authors, replies, attachments (names and IDs; get_message gives URLs), embeds and reactions. Page with before/after/around (message ID or ISO date). pinned: true lists pinned messages instead. To find messages by text or author, use search_messages. |
| get_messageA | Fetches one message by ID or link, with attachments (IDs, sizes, URLs), embeds, reactions and the message it replies to. include_replies: true also scans later messages for replies to it and says how many it scanned. |
| get_attachmentA | Opens a message's attachments so you can see them: images (screenshots, photos) come back as images, scaled down to a readable size; text files (logs, code, JSON, CSV) come back as text. Other files are listed with their size and URL. Pick one with "attachment" (ID or file name), or get all (up to 4 images). |
| search_messagesA | Finds messages by text, author, mentions, attachments/links (has), pinned state and date range. Uses Discord's server-wide search when available (whole history, all channels). Otherwise, or if scan: true, it scans one channel's history up to scan_limit and states exactly how much it scanned. Results include message IDs and channels; use get_message or read_messages around=ID for context. |
| recent_activityA | Shows which channels and threads had messages from people since a time ("24h" by default, or "7d", an ISO date), newest first, with how many messages and people and the latest message (include_bots adds bot activity). Use it to see what is going on without opening channels one by one; then read_messages. |
| get_new_messagesA | Returns messages that arrived across the server (or a channel, category or forum) since your last call, oldest first, from what Guildora received live during this session. Pass the returned next_cursor next time to get only newer ones. only_mentions keeps messages that mention or reply to the bot. For older history use recent_activity or read_messages. |
| list_unansweredA | Finds channels, tickets, threads and forum posts where the latest message from a person is not from staff, i.e. someone is waiting for a reply; sorted by longest wait. Staff = members with staff_roles, or by default anyone with Administrator, Manage Server, Manage Channels, Manage Messages or Timeout Members. Bot messages are ignored unless bot_replies_count is true. |
| send_messageA | Sends a message to a channel, thread, forum post or a user's DMs (pass "user"). Supports replies, up to 10 embeds and 10 file attachments (local path in stdio mode, https URL, or base64). Content max 2000 characters. @everyone/@here only ping if mention_everyone is true. Returns the new message ID and link. To start a new forum post, use create_thread. |
| edit_messageA | Edits a message the bot sent (content and/or embeds). suppress_embeds hides link previews on any message (needs Manage Messages for others' messages). Bots cannot change other users' text. |
| delete_messageA | Deletes one message (the bot's own, or anyone's with Manage Messages). Destructive: returns a dry run unless confirm is true. For many messages use bulk_delete_messages (moderation pack). |
| add_reactionC | Reacts to a message with a Unicode or custom server emoji. |
| remove_reactionA | Removes a reaction from a message: the bot's own by default, or another member's (needs Manage Messages). |
| pin_messageB | Pins a message (pinned: true, default) or unpins it (pinned: false). Max 50 pins per channel. |
| check_accessA | Explains channel access after roles and overwrites are combined. With "member" or "role": what they can and cannot do there, and which overwrites cause it. Without either: who can see the channel (roles, specific members, and a member count when available). Use it to check private ticket or staff channels. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| server_digest | Summarise what happened in the server recently and what needs attention. |
| triage_forum | Review the posts of a forum (bug reports, questions, suggestions) and propose next steps. |
| reply_queue | Find tickets and conversations waiting for a staff reply and draft answers. |
| catch_up | Summarise messages that arrived during this session, mentions of the bot first. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 20 tools
Most tools target a distinct resource+action, and the four message-reading tools (read_messages, search_messages, recent_activity, get_new_messages) are separated by explicit descriptions of when to use each. However, list_unanswered and recent_activity both answer 'what needs attention', and get_message vs read_messages around=ID create mild overlap that requires reading descriptions to resolve.
Mostly a predictable verb_noun snake_case pattern (list_channels, get_channel, send_message, delete_message, pin_message). A few deviations break the pattern: recent_activity is a bare noun phrase and list_unanswered uses verb_adjective rather than verb_noun.
At 20 tools it sits at the top of the comfortable range, but each tool maps to a recognizable Discord operation (read, send, edit, react, moderate, inspect). The count is slightly heavy given several read-path variants that could be consolidated.
Read/inspect and message lifecycle are well covered, but write-side moderation and structure are missing: no kick/ban/timeout, no role assignment or channel/thread creation. Worse, send_message tells the agent to 'use create_thread' and delete_message points at bulk_delete_messages, neither of which exists in this surface — real dead ends.