Skip to content

Caller-retained multi-channel message catch-up

catch_up_messages takes one exact permitted guild and a bounded caller-selected set of unique exact guild channels or threads. Each selection has its own optional afterMessageId; the connector never infers or shares cursors, and a cursor grants no access outside that selection's separately preflighted channel. The per-channel scan limit and complete request limit are fixed and validated before Discord access. Bot- and webhook-authored messages are omitted from previews by default, but they remain part of the scanned count and advance the safe next cursor so filtering cannot create a replay loop.

Before any message endpoint is called, the connector verifies its pinned application and bot, authoritative enabled Message Content intent, exact guild and channel read scope, every selected channel's guild and supported type, each thread's exact parent, connector membership in every selected private thread, the connector's guild member, the complete role inventory, bounded resolved permission overwrites, and complete effective VIEW_CHANNEL, READ_MESSAGE_HISTORY, and conditional voice CONNECT evidence. One failed selection rejects the complete call. Concurrent page reads can finish internally, but no partial channel result is returned.

A selection without a cursor is initialize mode. It reads the newest bounded page, returns a checkpoint at the newest scanned message, and reports olderMessagesMayExist when the page fills. This establishes a future baseline; it is not unread state, complete history, or evidence that the omitted past was reviewed. An empty initialization returns no invented cursor.

A selection with afterMessageId is catch-up mode. Discord returns message arrays newest to oldest. When the bounded page is full, the connector repeats the same after boundary with a one-message limit and requires that independent result to equal the oldest item in the full page. Only then does it return boundaryVerification: "verified" and advance to the newest message in that proven page. A contradiction, deletion race at that boundary, malformed ordering, duplicate, stale cursor result, or wrong channel or guild rejects the complete call rather than returning a cursor that could silently skip traffic. A full page reports newerMessagesMayExist; a later deliberate call is required. Short and empty pages need no boundary probe and do not claim future quiet.

Visible messages are chronological. The compact projection includes exact message, channel, guild, and author IDs; a whitespace-compacted Unicode-safe content preview with original character count and truncation state; timestamps; exact direct-reply target where valid; connector, bot, webhook, and system flags; mention, attachment, embed, component, reaction-kind, and sticker counts; pin, TTS, type, and canonical jump-link evidence. It omits usernames, global names, avatars, attachment filenames and URLs, embed bodies, component trees and custom IDs, emoji values, reaction users, mention profiles, referenced-message bodies, poll bodies, forwarded snapshots, unknown fields, and raw payloads. Channel names and previews are untrusted transient output.

The result states that cursor custody belongs to the caller, content is preview-only, automatic pagination and partial results are absent, and the connector persists no cursor, inbox, profile, raw payload, or message content. The catch_up_discord_channels prompt validates one exact request through the same normalizer, discovers only the exact configured contract when necessary, makes one tool call, reports every coverage field, emits one machine-copyable next-cursor object, and stops. Use get_message later only as a separate user-directed exact-detail read.

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.