codex-discord-mcp
Provides tools for interacting with Discord, enabling AI agents to send messages, read message history, add reactions, edit messages, download attachments, and manage a local queue of Discord messages for processing.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@codex-discord-mcpfetch the last 10 messages from #general"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
codex-discord-mcp
A local-first Discord bridge for Codex CLI.
Use it in three ways:
Discord -> Codex: mention or DM your bot, run
codex exec --json, and post the final answer back to Discord.Codex -> Discord: expose Discord tools to Codex through MCP, including
reply,fetch_messages,react,edit_message,download_attachment,latest_generated_images, andrecover_generated_image.Hybrid workflow: receive Discord messages into a local queue, then let Codex inspect and respond through MCP tools.
This is not an official OpenAI plugin. It is a local bridge designed around Codex CLI, MCP, and Discord bot APIs.
Which Mode Should I Use?
Goal | Use |
DM Codex from Discord |
|
Let Codex send Discord replies |
|
Let Codex read recent Discord messages |
|
Queue Discord messages for Codex to inspect |
|
Fully automatic Discord -> Codex -> Discord |
|
Related MCP server: Codex Bridge MCP
Security Model
This bridge treats Discord as untrusted input.
Discord users cannot:
approve pairings
allow users
allow channels
change bridge policy
read bridge state files
bypass Codex sandbox or approval settings
Only local terminal commands can change access policy. MCP tools can read and reply through allowlisted Discord channels, but they cannot modify the allowlist or approve pairings.
Default safety posture:
Default sandbox:
read-onlyDefault approval policy:
never, becausebotmode is non-interactiveRecommended first run:
read-onlyUse
workspace-writeonly in an isolated repository or disposable worktreeNever use
danger-full-accessfor a public Discord channel
When bot mode starts with CODEX_SANDBOX=workspace-write or CODEX_SANDBOX=danger-full-access and CODEX_APPROVAL_POLICY=never, the bridge prints a runtime warning. Set CODEX_DISCORD_ASSUME_YES=true to suppress the warning in controlled automation.
Requirements
Node.js 20 or newer.
Codex CLI installed and authenticated for
botmode.A Discord application with a bot token.
Discord bot privileged Message Content Intent enabled.
Install
Global install:
npm install -g codex-discord-mcp
codex-discord-mcp doctor
codex-discord-mcp initRun through npx without a global install:
npx -y codex-discord-mcp doctorLocal development install:
npm install
npm run build
node ./dist/cli.js --helpDiscord Bot Setup
Create a Discord application in the Discord Developer Portal.
Add a bot and copy its token.
Enable Message Content Intent for the bot.
Invite the bot to a server if you want guild channels.
Useful bot permissions:
View Channels
Send Messages
Send Messages in Threads
Read Message History
Attach Files
Add Reactions
Print an invite URL:
codex-discord-mcp invite-url <client-id>Store the token locally:
codex-discord-mcp configureThe token is written to ~/.codex/discord/.env by default. Override the state directory with CODEX_DISCORD_STATE_DIR.
You can also read the token from an existing environment variable:
codex-discord-mcp configure --token-env DISCORD_BOT_TOKENQuick Start
Interactive setup:
codex-discord-mcp initCheck local configuration:
codex-discord-mcp doctor
codex-discord-mcp doctor --jsonMode 1: Discord To Codex Relay
Run:
codex-discord-mcp botDefault behavior:
Unknown DM users receive a one-hour pairing code.
Pair locally with
codex-discord-mcp access pair <code>.After pairing, each DM message triggers
codex exec --json.The final Codex message is posted as a Discord reply.
Files the run produced are attached to that reply automatically (see below).
Useful environment variables:
export CODEX_WORKDIR="/path/to/repo"
export CODEX_SANDBOX="read-only"
export CODEX_APPROVAL_POLICY="never"
export CODEX_RESUME_BY_CHANNEL="true"
codex-discord-mcp botFor unattended relay mode, keep CODEX_APPROVAL_POLICY=never and use the least permissive sandbox that fits the channel.
Relay File Delivery
bot mode delivers files, not just text, on by default (CODEX_DISCORD_RELAY_ATTACHMENTS=false disables both paths):
Generated images. Codex's built-in
image_genusually writes no file to disk; the image survives only as base64 inside the session rollout. The relay records the rollout size before each run and, after the run, decodes anyimage_generation_callresults appended past that offset — so it attaches exactly the images this run generated, even on long resumed threads, without re-reading the whole rollout.Outbox deliverables. The prompt tells Codex to save user-facing files under a per-channel outbox directory (
CODEX_DISCORD_OUTBOX_DIR, default~/.codex/discord_outbox/<channel-id>/). Document, data, archive, and media files written there during the run are attached to the reply; code files, logs, and dotfiles are ignored.
Attachments respect Discord limits: at most 10 files per reply, 25MB each. If attaching fails, the relay retries text-only so the answer itself is never lost.
Mode 2: Codex MCP Tools
Print a local config snippet:
codex-discord-mcp print-configPrint an npx based config snippet:
codex-discord-mcp print-config --npxAdd the snippet to ~/.codex/config.toml or a trusted project .codex/config.toml. A typical npx config looks like:
[mcp_servers.discord]
command = "npx"
args = ["-y", "codex-discord-mcp", "mcp"]
startup_timeout_sec = 20
tool_timeout_sec = 60Then start Codex and run /mcp to confirm the Discord tools are loaded.
Available MCP tools:
Tool | Risk | Notes |
| Low | Reads recent allowlisted channel history |
| Low | Reads local queue entries |
| Low | Reads local bridge status |
| Low | Adds a reaction |
| Medium | Sends a Discord message |
| Medium | Sends a Discord message |
| Medium | Edits a message previously sent by the bot |
| Medium | Downloads Discord attachments into the local inbox |
| Low | Returns absolute paths of the newest images from Codex's |
| Medium | Decodes the most recent |
| Medium | Mutates local queue state |
Access Control
Access is managed by local CLI commands, not MCP tools.
codex-discord-mcp access show
codex-discord-mcp access policy allowlist
codex-discord-mcp access allow-user 123456789012345678
codex-discord-mcp access allow-channel 234567890123456789
codex-discord-mcp access allow-channel 234567890123456789 --no-mentionDM policy values:
pairing: unknown DM users get a one-hour pairing code. This is the default.allowlist: unknown DM users are silently ignored.disabled: all DMs are ignored.
Guild channels are opt-in by channel ID. By default, the bot only responds in an allowed guild channel when it is mentioned or when the user replies to a recent bot message. Use --no-mention only for dedicated bot channels.
Attachment Safety
The bridge refuses to attach its own state files, except files downloaded into the inbox. It also blocks attachment paths outside the configured attachment roots.
Attachment uploads are restricted by default to:
the bridge process working directory
CODEX_WORKDIRthe bridge inbox
Codex's built-in
image_genoutput directory (~/.codex/generated_images, orCODEX_DISCORD_GENERATED_IMAGES_DIR)the relay outbox (
~/.codex/discord_outbox, orCODEX_DISCORD_OUTBOX_DIR)
The image_gen output directory is always allowed so generated images can be
attached. Codex's built-in image_gen shows an inline preview but often writes
no file to disk — in that case call recover_generated_image, which decodes the
just-generated image from the active session rollout and saves it to the
image_gen output dir, returning the absolute path. (latest_generated_images
lists already-saved image files.) Then pass the path in the files array of
reply/send_message.
To allow generated files from other roots, set CODEX_DISCORD_ATTACHMENT_ROOTS using your platform path delimiter:
export CODEX_DISCORD_ATTACHMENT_ROOTS="/path/to/repo:/path/to/exports"On Windows PowerShell:
$env:CODEX_DISCORD_ATTACHMENT_ROOTS="C:\path\to\repo;C:\path\to\exports"Configuration Reference
Variable | Default | Meaning |
| required | Discord bot token |
|
| Bridge state directory |
|
| Codex executable |
| process cwd | Working directory for Codex |
|
| Codex sandbox mode |
|
| Codex approval policy for non-interactive bot mode |
| unset | Override Codex model |
| unset | Use a Codex profile |
|
| Resume one Codex thread per Discord channel |
|
| Codex process timeout in milliseconds |
| unset | Extra arguments passed to Codex |
|
| Pass |
| cwd, workdir, inbox | Allowed outbound file roots |
|
| Codex |
|
|
|
|
| Base directory Codex is told to save relay deliverables under (one subdirectory per channel) |
|
| Suppress writable unattended bot warning |
Troubleshooting
codex-discord-mcp doctor
codex-discord-mcp access showIf the bot receives empty message content, enable Message Content Intent in the Discord Developer Portal.
If bot mode cannot launch Codex, set CODEX_COMMAND to the full executable path or run the bridge from the same shell where codex exec "hello" works.
If MCP tools do not appear, run:
codex-discord-mcp print-config --npxThen add the printed snippet to Codex config and restart Codex.
Development
npm install
npm run typecheck
npm test
npm run buildDevelopment commands:
npm run dev:mcp
npm run dev:botRelease
The package is prepared for npm publishing with:
binentry:codex-discord-mcpfileswhitelist for published package contentsprepublishOnlyvalidation: typecheck, tests, buildLinux and Windows GitHub Actions CI
Available Tools
11 toolsbridge_statusA
Show bridge state path, queue counts, and Discord login status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. 'Show' clearly indicates a read-only operation, and the listed outputs give some behavioral insight. However, it does not mention potential side effects, authentication requirements, or failure modes, leaving some ambiguity for a status tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the action and outputs without wasted words. It is perfectly sized for the information it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, no-output-schema tool, the description sufficiently covers the main return values: bridge state path, queue counts, and Discord login status. It does not elaborate on what 'bridge state path' means or when to use it, but given the simplicity, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete. The description adds no parameter details, but none are needed. Baseline 4 is appropriate for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Show' and specifies three concrete outputs: bridge state path, queue counts, and Discord login status. This distinguishes it from sibling tools that send messages or manage conversations, and it is not a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is provided, and no alternatives are mentioned. The name and description imply it is for status monitoring, which is adequate but not clearly stated. It is distinct from siblings by function, but the guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_attachmentA
Download all attachments from a Discord message into the local bridge inbox and return absolute paths.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the core behavior (downloads all attachments, stores in local bridge inbox, returns absolute paths) but lacks details on edge cases, permissions, or side effects. It is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded and contains no wasted words. Every part contributes to understanding the tool's purpose and behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description includes the return value (absolute paths) and the destination (local bridge inbox). For a simple 2-parameter tool, it covers the main functional aspects, though it lacks parameter descriptions and potential edge-case behavior. Overall, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description does not mention the parameters at all. The parameter names (chat_id, message_id) are somewhat self-explanatory from context, but the description fails to provide explicit semantics or formats, leaving a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (download), the resource (all attachments from a Discord message), and the outcome (return absolute paths). It is specific and distinguishes from sibling tools like send_message or reply.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when attachments from a message need to be retrieved, but it does not explicitly state when to use this tool versus alternatives or provide exclusions. The context is clear from the purpose, but no explicit alternatives or conditions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_messageA
Edit a Discord message previously sent by the bot.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| chat_id | Yes | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavior. It states the key restriction (only bot-sent messages can be edited), but does not disclose potential failure modes, authorization requirements, rate limits, or side effects. This is minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the action, and contains no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a simple 3-parameter schema, no output schema, and no annotations. The description covers the core purpose and scope but omits parameter explanations and any note about return values or error conditions, leaving some gaps for a complete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no descriptions for the three required parameters (text, chat_id, message_id), and the description does not explain them. With 0% schema coverage, the description was expected to compensate but does not, leaving parameter semantics entirely to parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Edit', identifies the resource as 'a Discord message', and adds the scoping constraint 'previously sent by the bot', which clearly distinguishes it from siblings like send_message and reply.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The condition 'previously sent by the bot' gives clear context that this tool is for modifying existing bot-sent messages, implying it should not be used for messages from other users or for sending new messages. However, it does not explicitly name alternatives or exclusions, so it falls between implied and clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_messagesB
Fetch recent Discord channel history, oldest first. Discord's bot API does not expose full search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| channel | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description provides useful behavioral detail: messages are returned oldest first, and full search is not available. However, it omits the return format, default limit, and any rate-limit or error behavior, leaving gaps for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first states the core action with ordering, second adds a relevant API limitation. No filler, front-loaded with the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and no annotations, so the description should clarify the return value, default limit, and parameter semantics. It does not, leaving significant operational gaps for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not explain the 'limit' or 'channel' parameters. The phrase 'Discord channel history' hints at the channel, but 'limit' is entirely unexplained, failing to compensate for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Fetch'), resource ('Discord channel history'), and gives ordering ('oldest first') and scope ('recent'). It distinguishes this read tool from sibling write tools like send_message, reply, and edit_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied ('Fetch recent Discord channel history') and the API limitation offers some context, but there is no explicit guidance about when to choose this over siblings or when not to use it. No alternatives are directly named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
latest_generated_imagesA
Return absolute paths of the most recently generated images from Codex's built-in image_gen output directory (default ~/.codex/generated_images), newest first. Use this to recover the path of an image you just generated so you can attach it via the files array of reply or send_message.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the source directory (including default ~/.codex/generated_images) and the ordering (newest first). However, it does not explain what happens when no images exist, how the limit parameter affects results, or the exact return format beyond 'absolute paths'. These are meaningful gaps for a tool with zero annotation safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core purpose, and every clause adds value. The first sentence states exactly what the tool returns and from where, and the second provides a concrete use case. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter, the description covers the primary purpose and usage. However, it omits documentation of the limit parameter and any mention of default behavior when limit is not provided. Given there is no output schema, the description should have been more explicit about the return value's shape and the effect of the parameter. This is a clear, but not fatal, gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one parameter, 'limit', with no description, and the overall schema coverage is 0%. The description does not mention the parameter at all, leaving the agent to infer its meaning from the name. Since the description was expected to compensate for the low schema coverage, this is a significant omission, though the parameter name is somewhat intuitive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Return absolute paths of the most recently generated images from Codex's built-in image_gen output directory'. It specifies the resource (image_gen output directory) and the action (return absolute paths), and it distinguishes itself from siblings by focusing on generated images and providing paths for attachment. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use the tool: 'Use this to recover the path of an image you just generated so you can attach it via the files array of reply or send_message.' This provides clear usage context. It does not explicitly mention when not to use it or name alternatives, but the guidance is strong enough to make the intended use case obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pending_messagesA
List queued inbound Discord messages that have not been marked handled. Use this because Codex MCP has no Discord push channel.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that this is a read-only listing operation ('List') and defines the scope (only unhandled queued messages). It adds context about the lack of push channel, which justifies the tool's existence. It does not mention rates, ordering, or side effects, but the core behavioral trait is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences: the first states the primary purpose, the second provides the rationale. No extraneous information. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description should at least explain the 'limit' parameter and hint at the return structure. It does neither. While the purpose is clear, the missing parameter documentation represents a significant gap, making the description incomplete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides zero description for the only parameter 'limit' (0% coverage), and the tool description does not mention it at all. The description fails to explain what 'limit' does, leaving the agent without any guidance on how to use the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states a specific verb and resource: 'List queued inbound Discord messages that have not been marked handled.' It distinguishes itself from siblings by emphasizing 'queued' and 'not marked handled,' and even explains the rationale ('no Discord push channel').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit context for when to use the tool: 'Use this because Codex MCP has no Discord push channel.' This implies it is the intended polling mechanism for new messages, though it does not explicitly name alternative tools or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_message_handledA
Mark a queued Discord message as handled after replying or deciding no reply is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| queue_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It does not explain what 'handled' means (e.g., permanent removal from queue, idempotence, or reversibility) or any side effects. This is a significant gap for a mutating operation, leaving the agent uncertain about consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the core action and timing with zero unnecessary words. It is concise and well-structured, though it omits some behavioral context (covered elsewhere).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description is nearly adequate, covering purpose and timing. However, it fails to clarify what 'handled' entails behaviorally, and the parameter semantics are underexplained. It meets the minimum viable threshold but leaves clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for queue_id, and the description does not mention the parameter at all. The parameter name is somewhat self-explanatory, but the description does not compensate for the lack of schema-level details, such as how to obtain the queue_id or what format it takes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('mark') and resource ('queued Discord message') and clearly states the action ('as handled'). It distinguishes this tool from sibling messaging tools (reply, send_message, etc.) by focusing on queue state management rather than message transmission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'after replying or deciding no reply is needed.' This gives clear contextual timing without naming alternatives, which is appropriate since no sibling tool performs this exact function. It lacks exclusionary guidance but is sufficient for the simple use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reactA
Add an emoji reaction to a Discord message. Unicode emoji work directly; custom emoji use Discord custom emoji syntax.
| Name | Required | Description | Default |
|---|---|---|---|
| emoji | Yes | ||
| chat_id | Yes | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds useful context about Unicode vs. custom emoji syntax, but does not disclose whether the reaction is additive, if permissions are required, or any error behavior beyond the implied mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose and immediately useful syntax detail. Every word earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the description covers the core action and emoji format, but it omits any error handling, success/failure behavior, or whether custom emoji must belong to the same server. Given the lack of annotations and output schema, a bit more context would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It only explains the 'emoji' parameter format; 'chat_id' and 'message_id' are left implicit by name. This is a significant gap given the schema provides no descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Add an emoji reaction') and resource ('Discord message'), with specific syntax details for Unicode and custom emoji that distinguish it from sibling messaging tools like reply and send_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies usage for reactions rather than sending or replying, but the description does not explicitly state when to use this tool over alternatives or provide any exclusions. It relies on the reader to infer from the verb 'react'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recover_generated_imageA
Recover the most recently generated image(s) from the active Codex session rollout and write them to disk. Codex's built-in image_gen shows an inline preview but usually writes no file; this decodes the image from the session log and saves it to the generated-images dir, returning absolute path(s) ready to pass to the files array of reply/send_message. Optional count (default 1) and session_file (absolute rollout path; defaults to the newest session).
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| session_file | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for disclosing side effects. It clearly discloses that it decodes from the session log and writes to disk, and returns absolute paths. It does not mention failure modes or overwrite behavior, but the core behavior is transparent. This is strong given the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences pack in the action, rationale, and parameter details without redundancy. Each sentence adds value: the first states the core function, the second explains the need and output, the third defines parameters. This is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and lack of output schema, the description provides sufficient context: it explains why the tool exists, what it returns, and how to pass results to reply/send_message. It doesn't address error handling or edge cases, but for a 2-parameter utility, it is nearly complete, hence a 4 rather than 3.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions (0% coverage), so the description must compensate. It does so effectively by explaining 'count (default 1)' and 'session_file (absolute rollout path; defaults to the newest session),' adding meaning beyond the plain types. It doesn't specify constraints like valid ranges, but the core semantics are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's primary action: 'Recover the most recently generated image(s)... and write them to disk.' It distinguishes itself from siblings by explaining the Codex inline preview limitation and that this tool decodes and saves the image, differentiating it from tools like latest_generated_images or reply.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool: when Codex's image_gen shows an inline preview but doesn't write a file. It also notes the output is 'ready to pass to the files array of reply/send_message,' indicating a clear integration point. However, it doesn't explicitly mention alternatives or when not to use it, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replyA
Reply in Discord. Pass chat_id from a queued message. Optional reply_to threads under a Discord message id. Optional files are absolute local paths.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| files | No | ||
| chat_id | Yes | ||
| reply_to | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains the source of chat_id, the semantic of reply_to, and the absolute path requirement for files. It omits error behavior, but for a simple messaging tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each adding necessary information: the action, the required chat_id source, and optional parameters. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, required parameter context, and optional parameter semantics. Given no output schema, the lack of return value discussion is acceptable. Minor gap: no explicit statement about success/failure behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description compensates by explaining chat_id provenance, reply_to threading, and files path format. The text parameter is self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Reply in Discord' with a specific verb and resource. It differentiates itself from siblings by requiring a chat_id from a queued message, which is a distinct use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: 'Pass chat_id from a queued message' and optional reply_to threading. It does not explicitly exclude alternatives or state when not to use it, but the operational context is strong enough for an agent to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageA
Send a Discord message to an allowlisted chat. Same behavior as reply, but the name is explicit for non-reply sends.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| files | No | ||
| chat_id | Yes | ||
| reply_to | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It only mentions 'allowlisted' as a constraint and vaguely references 'same behavior as reply' without elaborating on side effects, permissions, rate limits, or failure modes. This leaves significant behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, and both sentences add value (description and sibling distinction). No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 4 parameters and no output schema, but the description only provides basic send semantics. It omits parameter descriptions, reply behavior details, attachment handling, and any return/response info, making it insufficient for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description does not explain any of the four parameters (text, files, chat_id, reply_to). No semantics are added beyond the schema's bare field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sends a Discord message to an allowlisted chat, and distinguishes it from the sibling 'reply' by noting it's for non-reply sends. This provides a specific verb and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly contrasts with the 'reply' sibling, clarifying when to use this tool (non-reply sends) and implying reply is for reply scenarios. This gives clear context and a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
11 tool updates
v0.2.0- First observed
bridge_status - First observed
download_attachment - First observed
edit_message - First observed
fetch_messages - First observed
latest_generated_images - First observed
list_pending_messages - First observed
mark_message_handled - First observed
react - First observed
recover_generated_image - First observed
reply - First observed
send_message
TDQS
reply and send_message are described as identical in behavior, causing clear overlap and potential misselection. latest_generated_images and recover_generated_image also serve similar purposes with subtle differences that could confuse. Other tools are distinct enough.
Naming mixes verb_noun patterns (send_message, edit_message) with bare verbs (reply, react) and noun phrases (latest_generated_images, bridge_status). While most names are readable, the inconsistency undermines predictability.
At 11 tools, the count is reasonable for a Discord integration, though a few tools (reply/send_message) appear redundant and could be consolidated. Not excessive or thin.
Core Discord operations (send, edit, react, fetch, attachments) are covered, along with a queue mechanism and status check. Missing delete message and channel listing are minor gaps; agents can work around them using existing tools.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A paid remote MCP for OpenAI Codex agent coordination MCP, built to return verdicts, receipts, usage
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Human-input bridge for AI agents with voice-first answer links, MCP tools, and HTTP APIs.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that provides native Discord tools for Claude Code, enabling bidirectional communication with remote agents or humans via the Discord REST API. It allows users to send messages, read channel history, and manage reactions directly from their local environment.6193MIT
- FlicenseNot gradedqualityBmaintenanceCodex Bridge MCP is a local MCP orchestration service for a stable Claude Code x Codex CLI development workflow.2-
- FlicenseNot gradedqualityBmaintenanceA local-first Codex plugin that bundles an MCP server to safely interact with Mattermost, enabling channel/thread summarization, conversation search, and reviewed post publishing via the Mattermost REST API.-
- AlicenseNot gradedqualityBmaintenanceA personal MCP bridge that lets ChatGPT drive a local Codex CLI, translating instructions into Codex app-server threads and returning compact summaries of what Codex did.7MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Openclaw-Metis/codex-discord-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server