Skip to content

Readable message text

get_message and read_messages preserve the normalized message, original content including empty strings, components, embeds, flags, and pagination metadata in structuredContent. Their first text block remains a concise summary. A second block presents each returned message's exact message and author IDs, timestamp, original content, supported Text Display content, and embed text in source order. An empty page needs only the summary. This projection adds no Discord request or local persistence and uses the same guild and channel read scope.

The text block labels Discord values as untrusted data and places labeled JSON string literals inside a fenced block. Line breaks, quotes, controls, bidirectional formatting characters, tag delimiters, and backticks are escaped so a message cannot close the fence or inject a separate receipt line. Unicode and whitespace survive literal decoding. Secret redaction happens before escaping, and the original structured fields pass through the same redaction boundary. For example, a component-only announcement can retain content: "" while presenting:

Content: ""
Text Display: "# Announcement\nThe meeting starts at 10."

The renderer follows Discord's component structure through Action Rows, Containers, and Sections, including Section accessories, and reads Text Display content. It presents embed text in author, title, description, field name/value, and footer order. Separators and spoiler containers receive fixed labels. Unsupported components such as buttons, selects, media, and unknown types receive omission notes. Malformed text and structures beyond the traversal limits are also identified explicitly. Empty and media-only messages state that no supported non-empty text was returned. Forwarded snapshots remain withheld. The renderer does not infer hidden content or expand arbitrary unknown fields.

Traversal is limited to 40 component nodes and eight levels per message, ten embeds per message, and 25 fields per embed. A structural limit affects only the text projection and points to the preserved structured evidence. Media and link destinations are not fetched or added to the text projection; URLs already present in text remain literal data, and normalized attachment metadata omits delivery URLs. The complete redacted result, including summary, readable text, and structured fields, must fit limits.mcpReadResponseMaxBytes. Oversized results are refused whole with response-too-large, without truncated strings or a partial page; request a smaller page or review the configured limit. Search, reply scans, catch-up, direct-message, and webhook reads retain their separate projection contracts.

Canonical source: docs/reference.md

Documentation generated for guildctl@2.3.1. 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.