Reviewed forum posts
Forum-post creation has no immediate-call path. Set capabilities.forumPosts: true and list every eligible forum by its own exact ID in scopes.forumPostChannelIds. The forum allowlist must be a subset of readScope.channelIds when the read allowlist is present. Parent or guild scope never grants forum-post authority to another channel.
The narrow surface targets stable GUILD_FORUM channels only. It creates one public thread with one plain-text starter message and accepts an exact title, up to five exact available tag IDs, optional archive duration and thread slowmode, optional exact notification user IDs with visible mentions, a Discord audit-log reason, and a unique one-shot operation key. It does not accept media channels, files, embeds, components, stickers, fuzzy tag names, standalone or private threads, edits, locks, archive actions, pins, tag administration, deletion, or rollback.
Grant the bot View Channel, Read Message History, and Send Messages in each selected forum. Discord ignores Create Public Threads for forum-post creation. Selecting a moderated tag additionally requires Manage Threads. Planning validates the complete bounded guild-role inventory, the forum's complete permission-overwrite evidence, its exact type and guild, every available tag definition, REQUIRE_TAG, moderated tags, settings, and notification policy before producing a digest.
- Call
plan_forum_postwith the exact forum ID, title, starter content, tag IDs, optional settings and notification IDs, audit reason, and one-shot operation key. - Review the exact guild and forum IDs, untrusted names and content, selected tag properties, forum defaults, complete permission evidence, warnings, hashed operation key, and keyed digest.
- Call
execute_forum_postwith identical inputs plus the digest. - Approve the signed MCP confirmation only if every exact ID, content field, setting, notification, warning, reason, operation-key hash, and digest remains intended.
- Review the returned thread and starter-message IDs, jump URL, readback verification, drift fields, activity ID, and outcome before any follow-up.
The process-keyed digest excludes the raw operation key and binds its domain-separated hash, the normalized request, bot identity and roles, exact guild and forum state, permission evidence, available and selected tags, audit reason, title, content, settings, and notification IDs. A connector restart invalidates the digest. The MCP adapter rebuilds the plan before approval, and the service rebuilds it again before reserving the key.
Discord's forum-thread endpoint supplies no nonce or idempotency token. Before the one and only POST, the connector passes the shared anti-spam guard, atomically reserves the operation-key hash in a durable private receipt, and appends a pending content-free activity record. The title, content, tags, notifications, audit reason, and raw key are absent from both records. A reserved key remains spent after every outcome. A known Discord 4xx rejection without a thread ID is recorded as failed; a transport error, Discord 5xx response, malformed success, or any failure after a thread ID becomes visible is uncertain and may represent a completed write.
Executions for the same forum and normalized logical title serialize inside one process. The production facade additionally acquires a durable exact forum-channel claim, so connector processes sharing the activity-state root exclude overlapping forum-post creation. If the leading execution ends uncertain, the claim remains quarantined for operator review. This does not claim global title uniqueness, and Discord permits multiple posts with the same title.
After the POST, the connector validates Discord's returned thread and nested starter message, then performs exact thread and message GETs using the shared thread and starter-message ID. It verifies the guild, parent forum, public-thread type, bot ownership, title, content, tags, archive duration, slowmode, and unlocked active state. Safe server adjustment returns completed-with-drift and fixed drift-field names without echoing content. The connector never retries, edits, deletes, or compensates. After an uncertain outcome, inspect the exact forum and Discord audit log before deciding whether a new reviewed intent with a new key is appropriate. See Discord's forum thread reference.
Canonical source: docs/reference.md
Documentation generated for guildcontrol@0.0.0. Canonical source and edit history remain in the public repository. GuildControl is an independent project and is not affiliated with or endorsed by Discord Inc. Discord is used only to identify the platform that GuildControl connects to.