Skip to main content
Glama
Openclaw-Metis

codex-discord-mcp

codex-discord-mcp

CI

A local-first Discord bridge for Codex CLI.

Use it in three ways:

  1. Discord -> Codex: mention or DM your bot, run codex exec --json, and post the final answer back to Discord.

  2. Codex -> Discord: expose Discord tools to Codex through MCP, including reply, fetch_messages, react, edit_message, download_attachment, latest_generated_images, and recover_generated_image.

  3. 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

bot mode

Let Codex send Discord replies

mcp mode

Let Codex read recent Discord messages

mcp mode

Queue Discord messages for Codex to inspect

mcp mode with list_pending_messages

Fully automatic Discord -> Codex -> Discord

bot mode

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-only

  • Default approval policy: never, because bot mode is non-interactive

  • Recommended first run: read-only

  • Use workspace-write only in an isolated repository or disposable worktree

  • Never use danger-full-access for 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 bot mode.

  • 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 init

Run through npx without a global install:

npx -y codex-discord-mcp doctor

Local development install:

npm install
npm run build
node ./dist/cli.js --help

Discord Bot Setup

  1. Create a Discord application in the Discord Developer Portal.

  2. Add a bot and copy its token.

  3. Enable Message Content Intent for the bot.

  4. 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 configure

The 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_TOKEN

Quick Start

Interactive setup:

codex-discord-mcp init

Check local configuration:

codex-discord-mcp doctor
codex-discord-mcp doctor --json

Mode 1: Discord To Codex Relay

Run:

codex-discord-mcp bot

Default 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 bot

For 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_gen usually 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 any image_generation_call results 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-config

Print an npx based config snippet:

codex-discord-mcp print-config --npx

Add 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 = 60

Then start Codex and run /mcp to confirm the Discord tools are loaded.

Available MCP tools:

Tool

Risk

Notes

fetch_messages

Low

Reads recent allowlisted channel history

list_pending_messages

Low

Reads local queue entries

bridge_status

Low

Reads local bridge status

react

Low

Adds a reaction

reply

Medium

Sends a Discord message

send_message

Medium

Sends a Discord message

edit_message

Medium

Edits a message previously sent by the bot

download_attachment

Medium

Downloads Discord attachments into the local inbox

latest_generated_images

Low

Returns absolute paths of the newest images from Codex's image_gen output dir

recover_generated_image

Medium

Decodes the most recent image_gen image from the Codex session rollout and writes it to disk

mark_message_handled

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-mention

DM 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_WORKDIR

  • the bridge inbox

  • Codex's built-in image_gen output directory (~/.codex/generated_images, or CODEX_DISCORD_GENERATED_IMAGES_DIR)

  • the relay outbox (~/.codex/discord_outbox, or CODEX_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

DISCORD_BOT_TOKEN

required

Discord bot token

CODEX_DISCORD_STATE_DIR

~/.codex/discord

Bridge state directory

CODEX_COMMAND

codex

Codex executable

CODEX_WORKDIR

process cwd

Working directory for Codex

CODEX_SANDBOX

read-only

Codex sandbox mode

CODEX_APPROVAL_POLICY

never

Codex approval policy for non-interactive bot mode

CODEX_MODEL

unset

Override Codex model

CODEX_PROFILE

unset

Use a Codex profile

CODEX_RESUME_BY_CHANNEL

false

Resume one Codex thread per Discord channel

CODEX_TIMEOUT_MS

900000

Codex process timeout in milliseconds

CODEX_EXTRA_ARGS

unset

Extra arguments passed to Codex

CODEX_SKIP_GIT_REPO_CHECK

true

Pass --skip-git-repo-check to codex exec

CODEX_DISCORD_ATTACHMENT_ROOTS

cwd, workdir, inbox

Allowed outbound file roots

CODEX_DISCORD_GENERATED_IMAGES_DIR

~/.codex/generated_images

Codex image_gen output dir surfaced by latest_generated_images and always allowed for attachments

CODEX_DISCORD_RELAY_ATTACHMENTS

true

bot mode: auto-attach images and outbox files produced by each run

CODEX_DISCORD_OUTBOX_DIR

~/.codex/discord_outbox

Base directory Codex is told to save relay deliverables under (one subdirectory per channel)

CODEX_DISCORD_ASSUME_YES

false

Suppress writable unattended bot warning

Troubleshooting

codex-discord-mcp doctor
codex-discord-mcp access show

If 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 --npx

Then add the printed snippet to Codex config and restart Codex.

Development

npm install
npm run typecheck
npm test
npm run build

Development commands:

npm run dev:mcp
npm run dev:bot

Release

The package is prepared for npm publishing with:

  • bin entry: codex-discord-mcp

  • files whitelist for published package contents

  • prepublishOnly validation: typecheck, tests, build

  • Linux and Windows GitHub Actions CI

Available Tools

11 tools
bridge_statusA

Show bridge state path, queue counts, and Discord login status.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_idYes
message_idYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
chat_idYes
message_idYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
channelYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queue_idYes

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emojiYes
chat_idYes
message_idYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
session_fileNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
filesNo
chat_idYes
reply_toNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
filesNo
chat_idYes
reply_toNo

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 11 tool updatesv0.2.0
    • First observedbridge_status
    • First observeddownload_attachment
    • First observededit_message
    • First observedfetch_messages
    • First observedlatest_generated_images
    • First observedlist_pending_messages
    • First observedmark_message_handled
    • First observedreact
    • First observedrecover_generated_image
    • First observedreply
    • First observedsend_message

TDQS

A3.6/5.0
Disambiguation3/5

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 Consistency3/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivitySlowing
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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