npm package: @iflow-mcp/olivier-motium-discord-user-mcp
Description: Discord MCP server using user tokens. No bot setup required.
Latest version: 0.1.0

# discord-user-mcp

Discord MCP server using **user tokens**. No bot setup, no Developer Portal, no intents — just your token and go.

Built for [Claude Code](https://claude.com/claude-code) and any MCP-compatible client.

## Why user tokens?

Every other Discord MCP server requires creating a bot application, configuring intents, and inviting the bot to your server. This one uses your existing Discord session — the same access you already have in the app.

**Trade-off:** Using user tokens for automation is against Discord's ToS. This is a personal tool for your own account on your own machine. Use responsibly.

## Setup

### 1. Get your Discord token

Your token is stored encrypted in the Discord app's local storage. You can find it by:

- Opening Discord in a browser → DevTools → Network tab → any request → `Authorization` header
- Or extracting it from the desktop app's LevelDB storage (macOS: `~/Library/Application Support/discord/Local Storage/leveldb/`)

### 2. Add to Claude Code

```bash
claude mcp add discord -e DISCORD_TOKEN=your-token-here -- node /path/to/discord-user-mcp/dist/index.js
```

With a default server:

```bash
claude mcp add discord \
  -e DISCORD_TOKEN=your-token-here \
  -e DISCORD_DEFAULT_GUILD=your-server-id \
  -- node /path/to/discord-user-mcp/dist/index.js
```

### 3. Build from source

```bash
git clone https://github.com/olivier-motium/discord-user-mcp.git
cd discord-user-mcp
npm install
npm run build
```

## Tools (14)

### Core

| Tool | Description |
|------|-------------|
| `discord_list_guilds` | List servers you're in |
| `discord_list_channels` | List channels grouped by category |
| `discord_read_messages` | Read channel history with pagination |
| `discord_send_message` | Send a message, optionally as a reply |
| `discord_search` | **Search messages** by content, author, channel, date, attachment type |

### Essential

| Tool | Description |
|------|-------------|
| `discord_list_dms` | List DM conversations |
| `discord_send_dm` | Send a DM (by user ID or channel ID) |
| `discord_react` | Add emoji reaction to a message |
| `discord_pinned_messages` | Get pinned messages from a channel |
| `discord_list_threads` | List active threads in a server |
| `discord_guild_info` | Server details, roles, features |

### Additional

| Tool | Description |
|------|-------------|
| `discord_edit_message` | Edit your own message |
| `discord_delete_message` | Delete your own message |
| `discord_user_info` | User profile with server roles |

## Configuration

| Environment Variable | Required | Description |
|---------------------|----------|-------------|
| `DISCORD_TOKEN` | Yes | Your Discord user token |
| `DISCORD_DEFAULT_GUILD` | No | Default server ID — tools that need a guild will use this when not specified |

## Design choices

- **Plain text output** — no raw JSON. Messages formatted as `[2024-01-15 14:32] alice: content`. IDs always inline for tool chaining.
- **No discord.js** — raw `fetch` against Discord API v10. Zero runtime deps beyond MCP SDK.
- **Rate limit handling** — automatic retry with `retry_after` + jitter, up to 3 attempts.
- **Search is the star** — accepts usernames (resolved to IDs internally), date strings (`YYYY-MM-DD` converted to snowflakes), and all Discord search filters.
- **Conservative defaults** — 25 messages per read, not 100. Keeps output manageable for AI.

## License

MIT