Discord MCP
# Discord MCP
Local, read-only Discord MCP server. It uses stdio and direct Discord REST API calls—there is no HTTP listener, Kubernetes deployment, Gateway connection, event cache, or write tool.
## Safety boundaries
- `DISCORD_ALLOWED_GUILDS` is required; the server fails to start without it.
- `DISCORD_ALLOWED_CHANNELS` is optional but recommended. When set, all channel and message reads outside it are rejected.
- Message tools always return message bodies. Enable **Message Content Intent** for the bot in Discord Developer Portal; without it, Discord returns empty content fields.
- The bot needs only `View Channel` and `Read Message History` for the initial tools. Do not grant Administrator, management, moderation, webhook, invite, or voice permissions.
- The bot token stays in your local MCP configuration or a local `.env` file; `.env` is ignored by Git.
## Tools
- `discord_list_guilds`
- `discord_list_channels`
- `discord_get_channel`
- `discord_list_messages`
- `discord_get_message`
All tools are read-only. Message reads support a bounded `limit` (1–100) and a `before` or `after` cursor. The service never downloads attachments and never returns attachment URLs.
## Setup
```bash
npm install
```
Copy `.env.example` to an ignored local `.env` file if you want a convenience template, then export it deliberately before running the development command:
```bash
set -a
. ./.env
set +a
npm run dev
```
Populate `DISCORD_BOT_TOKEN` and the numeric guild ID in that local file. Use Discord's Developer Mode to copy IDs. Add channel IDs to `DISCORD_ALLOWED_CHANNELS` before enabling the server for a shared guild.
Build and verify without contacting Discord:
```bash
npm run check
npm run build
```
## Codex configuration
Export the configuration variables in the same local environment that launches the Codex CLI. Do not put the token in this repository or `config.toml`.
Add this local MCP entry to `~/.codex/config.toml`, replacing the path with your clone path:
```toml
[mcp_servers.discord]
command = "node"
args = ["/absolute/path/to/discord-mcp/dist/index.js"]
cwd = "/absolute/path/to/discord-mcp"
env_vars = [
"DISCORD_BOT_TOKEN",
"DISCORD_ALLOWED_GUILDS",
"DISCORD_ALLOWED_CHANNELS",
]
```
For example, in the shell you use to start Codex:
```bash
export DISCORD_BOT_TOKEN='...'
export DISCORD_ALLOWED_GUILDS='your-guild-id'
export DISCORD_ALLOWED_CHANNELS='your-test-channel-id'
codex
```
Build first, then restart Codex from that environment. If you use the ChatGPT desktop app rather than Codex CLI, configure the environment at the app-launch level or use the app's MCP-server form; a variable exported in an unrelated Terminal window will not be inherited by the already-running app.
## Development
```bash
npm run dev
npm test
npm run typecheck
```
`npm run dev` reads environment variables from the current shell. It deliberately does not load `.env` automatically so the token cannot be accidentally supplied through an unexpected execution path.
TDQS
Scored across 5 tools
Each tool targets a distinct resource and action: listing guilds, listing channels, getting channel metadata, listing messages, and getting a single message. There is no overlap or ambiguity between them.
All tool names follow the consistent pattern of 'discord_' + verb + '_' + noun, using lowercase snake_case throughout (list_guilds, get_channel, list_messages). This makes the set predictable and easy to navigate.
With 5 tools, the server is well-scoped and focused on read-only Discord operations. Each tool covers a distinct aspect of the domain without excess or omissions that would make the set feel thin.
The tool set provides solid read coverage (guilds, channels, messages), but lacks any write operations like sending messages or creating/deleting channels. This is a notable gap for a general-purpose Discord MCP, though it may be intentional for a read-only use case.