Skip to content
Back to skills

Discord Integration

BSecurity

Use when sending Discord messages or encountering bot permission errors - provides three-tier integration methods with automatic fallback (MCP → REST API → Gateway); prevents wasted time on OAuth scope issues

  • 4 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 12, 2026
documentationjavascriptgojavabashreactnodetestingdebugginggitapi

Works with

  • claude code
  • cli
  • api
  • mcp

Security analysis

B75/100
  • criticalExfiltrates credentials via HTTP — exact pattern from Snyk ToxicSkills study

Pro scans all 2 files and shows the line behind each finding

Scanned September 12, 2026

npx -y skills add aibot88/sec_skill_store --skill discord-integration --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Discord Integration?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Discord Integration
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/aibot88-discord-integration/badge)](https://www.skillsdirectory.com/skills/aibot88-discord-integration)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: discord-integration
version: 1.0.1
description: Use when sending Discord messages or encountering bot permission errors - provides three-tier integration methods with automatic fallback (MCP → REST API → Gateway); prevents wasted time on OAuth scope issues
triggers:
  - discord
  - send message
  - permission error
  - bot access
  - discord.js
  - mcp discord
---

# Discord Integration

Comprehensive skill for working with Discord from Claude Code using multiple methods with automatic fallback.

## When to Use This Skill

Use this skill when the user wants to:
- Send messages to Discord channels
- Read messages from Discord channels
- Troubleshoot Discord bot connection or permission issues
- Set up or configure Discord bot access
- Choose the best method for Discord interaction

**Trigger phrases:**
- "Send a message to Discord"
- "Post to #channel-name"
- "Read messages from Discord"
- "Discord bot isn't working"
- "Can't access Discord channel"

## When NOT to Use This Skill

**Do NOT use this skill for:**
- **Discord server management** - Use Discord's admin panel for creating channels, managing roles, or configuring server settings
- **Complex bot features** - For advanced slash commands, persistent state, or complex workflows, build a dedicated bot application
- **Real-time message listening** - This skill focuses on sending/reading; continuous message monitoring requires a persistent Gateway connection outside this skill's scope
- **Voice channel interactions** - This skill only handles text channels

## Available Bots on This Machine

### 1. Sombra (Local MCP Bot)
- **Purpose:** Claude Code MCP integration (this machine only)
- **Token Location:** `~/.claude/discordmcp/.env`
- **Client ID:** 1435274653126889544
- **Guild:** Nice Wolf Studio (745376918030909471)
- **Connection:** discord.js Gateway via MCP server
- **Use For:** Claude Code sessions, automated workflows

### 2. GladOSv3 (tjr-suite Bot)
- **Purpose:** Trading bot application
- **Token Location:** `~/Dev/tjr-suite/.env`
- **Client ID:** 1425850836277395506
- **Guild:** Nice Wolf Studio (745376918030909471)
- **Connection:** discord.js Gateway (always running)
- **Use For:** Trading signals, slash commands, application-specific tasks

**Important:** These are separate bots. Do not confuse their configurations.

## Three Integration Methods (Priority Order)

### Method 1: MCP Tools (PREFERRED)
**Availability:** After Claude Code full restart
**Tools:** `mcp__discord__send-message`, `mcp__discord__read-messages`

**Pros:**
- Clean, native Claude Code integration
- No manual script execution
- Persistent connection via discord.js Gateway
- Smart auto-discovery (find channels by name or ID)

**Cons:**
- Requires full Claude Code restart to load
- Not available immediately after config changes

### Method 2: Discord.js Gateway Script (FALLBACK)
**Availability:** Always (if bot token configured)
**Script:** `~/.claude/discordmcp/send-test-message.js`

**Pros:**
- Works immediately, no restart needed
- Direct access to discord.js library
- Can be customized easily
- Reliable connection

**Cons:**
- Requires manual script execution
- Less integrated than MCP tools

### Method 3: REST API (LAST RESORT)
**Availability:** Always
**Method:** Direct curl to Discord API v10

**Pros:**
- No dependencies
- Quick for testing

**Cons:**
- Often gets "Missing Access" (OAuth scope issues)
- Requires exact permissions
- Less reliable than Gateway methods

## Integration Method Selection (MANDATORY)

**ALWAYS follow this priority order - do NOT skip steps:**

```
User requests Discord interaction
  ↓
STEP 1: Are MCP tools available? (mcp__discord__send-message)
  YES → REQUIRED: Use MCP tools (Method 1)
  NO ↓
  ↓
STEP 2: Can we use send-test-message.js? (file exists, token configured)
  YES → REQUIRED: Use Gateway script (Method 2)
  NO ↓
  ↓
STEP 3: Try REST API (Method 3) with warning about limitations
  ↓
FALLBACK LOGIC:
  - If Method 1 fails → Immediately try Method 2
  - If Method 2 fails → Try Method 3
  - If Method 3 fails → Report error with troubleshooting steps
```

**CRITICAL:** You MUST attempt Method 1 (MCP) first, even if you think it won't work. Only fall back after confirming failure.

## Step-by-Step Instructions

### Step 1: Check Method Availability

**Before attempting any Discord interaction, determine which method is available:**

1. **Try MCP tools first:**
   ```javascript
   // Attempt to use MCP tool
   mcp__discord__send-message({
     channel: "CHANNEL_ID",
     message: "Test"
   })
   ```

   If you get "No such tool available" error → MCP not loaded

2. **Fall back to Gateway script:**
   ```bash
   # Check if script exists
   ls -la ~/.claude/discordmcp/send-test-message.js

   # Check if token configured
   grep DISCORD_TOKEN ~/.claude/discordmcp/.env
   ```

3. **REST API as last resort** (expect permission issues)

### Step 2: Execute Based on Available Method

#### Using Method 1: MCP Tools

**Send Message:**
```javascript
mcp__discord__send-message({
  channel: "1420759585349697710",  // Channel ID or name
  message: "Your message here"
})
```

**Read Messages:**
```javascript
mcp__discord__read-messages({
  channel: "1420759585349697710",
  limit: 10  // 1-100
})
```

#### Using Method 2: Gateway Script

**Send Message:**
```bash
cd ~/.claude/discordmcp
node send-test-message.js CHANNEL_ID "Optional custom message"

# Example:
node send-test-message.js 1420759585349697710 "Hello from Claude Code"
```

**Custom Message:**
Create a modified version of the script or pass message as argument.

#### Using Method 3: REST API

**Send Message:**
```bash
curl -X POST "https://discord.com/api/v10/channels/CHANNEL_ID/messages" \
  -H "Authorization: Bot ${DISCORD_BOT_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{"content": "Your message"}'
```

**Note:** Will likely fail with "Missing Access" - see troubleshooting.

### Step 3: Handle Errors

See troubleshooting section below for specific error codes and solutions.

## Red Flags - STOP

**If you encounter these situations, STOP and address them immediately:**

❌ **Skipping MCP method without trying first**
- **Why it's bad:** MCP is the most reliable method; skipping wastes time with inferior fallbacks
- **Fix:** Always attempt `mcp__discord__send-message` before assuming it won't work

❌ **Not checking bot permissions before sending**
- **Why it's bad:** Results in repeated "Missing Access" errors and wasted API calls
- **Fix:** Verify bot has "View Channel" and "Send Messages" permissions first

❌ **Retrying same failed method repeatedly**
- **Why it's bad:** Same input = same output; you're wasting time and rate limits
- **Fix:** After one failure, switch to next method in priority order

❌ **Missing token/credentials setup**
- **Why it's bad:** Nothing will work without valid authentication
- **Fix:** Verify token exists in appropriate .env file and test with `/users/@me` endpoint

❌ **Not handling 403 Forbidden errors properly**
- **Why it's bad:** 403 means permission issue, not connection issue
- **Fix:** Check channel-specific permissions or switch to Gateway method (better permission handling)

❌ **Using REST API when Gateway methods are available**
- **Why it's bad:** REST API has OAuth scope limitations that cause "Missing Access" errors
- **Fix:** Use MCP tools or Gateway script instead - they have proper intents

## Verification Checklist

**Before marking Discord integration as complete, verify:**

- [ ] **MCP tools attempted first** - You tried `mcp__discord__send-message` before other methods
- [ ] **Permissions verified for channel** - Bot has "View Channel" and "Send Messages" in target channel
- [ ] **Message sent successfully** - Received confirmation (not just "no error")
- [ ] **Error handling implemented** - Code handles failures gracefully with fallback or clear error message
- [ ] **Correct bot used** - Sombra for MCP/local, GladOSv3 for tjr-suite (not mixed up)
- [ ] **Token validated** - Tested token with `/users/@me` endpoint returns valid bot info

## Prerequisites

### General Requirements
- Bot must be in the target Discord server
- Bot must have proper permissions in the target channel
- Valid bot token must be configured

### For MCP Tools
- Claude Code must be fully restarted after mcp.json changes
- MCP server must be configured in `~/.claude/mcp.json`
- Discord MCP server must be built: `cd ~/.claude/discordmcp && npm run build`

### For Gateway Script
- Node.js installed
- discord.js package available (in discordmcp directory)
- Token in `~/.claude/discordmcp/.env`

### For REST API
- `DISCORD_BOT_TOKEN` environment variable set
- Bot must have been added with proper OAuth2 scopes

## Troubleshooting

### Error: "No such tool available: mcp__discord__send-message"

**Cause:** Discord MCP server not loaded in Claude Code.

**Solutions:**
1. **Verify MCP configuration exists:**
   ```bash
   grep -A 5 '"discord"' ~/.claude/mcp.json
   ```

   Should show:
   ```json
   "discord": {
     "type": "stdio",
     "command": "node",
     "args": ["/Users/USERNAME/.claude/discordmcp/build/index.js"]
   }
   ```

2. **Verify MCP server is built:**
   ```bash
   ls -la ~/.claude/discordmcp/build/index.js
   ```

3. **Test MCP server manually:**
   ```bash
   cd ~/.claude/discordmcp
   node build/index.js
   ```
   Should see: "Discord bot is ready!" and "Discord MCP Server running on stdio"

4. **Fully restart Claude Code:**
   - Quit completely (Cmd+Q or equivalent)
   - Relaunch application
   - Start new session

5. **If still not available, use Method 2 (Gateway script) instead.**

### Error: "Missing Access" (Code 50001)

**Cause:** Bot doesn't have permission to access that channel.

**Solutions:**

1. **Verify bot is in the server:**
   ```bash
   curl -H "Authorization: Bot TOKEN" \
     https://discord.com/api/v10/users/@me/guilds
   ```

2. **Check channel-specific permissions:**
   - Right-click channel in Discord
   - Edit Channel → Permissions
   - Add the bot (Sombra or GladOSv3)
   - Enable: View Channel, Send Messages, Read Message History

3. **Grant server-wide permissions:**
   - Server Settings → Roles
   - Find bot's role
   - Enable Send Messages permission

4. **If using REST API, switch to Gateway method** (discord.js or MCP tools)

### Error: "Unknown Guild" (Code 10004)

**Cause:** Bot is not in that Discord server.

**Solutions:**

1. **Verify bot membership:**
   ```bash
   curl -H "Authorization: Bot TOKEN" \
     https://discord.com/api/v10/users/@me/guilds
   ```

2. **Invite bot to server using OAuth2 URL:**

   **For Sombra (Local MCP):**
   ```
   https://discord.com/api/oauth2/authorize?client_id=1435274653126889544&permissions=69632&scope=bot
   ```

   **For GladOSv3 (tjr-suite):**
   ```
   https://discord.com/api/oauth2/authorize?client_id=1425850836277395506&permissions=69632&scope=bot
   ```

3. **After inviting, wait a few seconds for bot to join**

4. **Verify the bot appears in server member list**

### Error: Connection Timeout or "Discord bot is ready!" but MCP fails

**Cause:** Token invalid or bot permissions insufficient.

**Solutions:**

1. **Verify token is correct:**
   ```bash
   curl -H "Authorization: Bot TOKEN" \
     https://discord.com/api/v10/users/@me
   ```
   Should return bot user info, not error.

2. **Check token hasn't been regenerated:**
   - Go to Discord Developer Portal
   - Applications → Your Bot → Bot
   - If token was regenerated, update configs

3. **Verify bot has proper Gateway intents:**
   - In Developer Portal: Bot → Privileged Gateway Intents
   - Enable: Guilds, Guild Messages (Message Content if reading)

4. **Check .env file syntax:**
   ```bash
   cat ~/.claude/discordmcp/.env
   ```
   No extra spaces, quotes, or newlines around token.

### Error: "Channel not found or not a text channel"

**Cause:** Invalid channel ID or bot can't see it.

**Solutions:**

1. **Verify channel ID is correct:**
   - Right-click channel in Discord
   - Copy Channel ID (enable Developer Mode if needed)
   - Channel IDs are 17-19 digit numbers

2. **Check bot can see the channel:**
   - Bot must have "View Channel" permission
   - Channel must not be in a category the bot can't access

3. **Try using channel name instead of ID** (if using MCP tools):
   ```javascript
   mcp__discord__send-message({
     channel: "bot-testing-grounds",  // Name instead of ID
     message: "Test"
   })
   ```

## Bot Configuration Reference

### Sombra (Local MCP) Configuration

**Files:**
- **Token:** `~/.claude/discordmcp/.env`
- **MCP Config:** `~/.claude/mcp.json` (lines 55-61)
- **Source:** `~/.claude/discordmcp/src/index.ts`
- **Built:** `~/.claude/discordmcp/build/index.js`

**Environment Variables:**
```env
DISCORD_TOKEN=MTQzNTI3NDY1MzEyNjg4OTU0NA...
DISCORD_CLIENT_ID=1435274653126889544
DISCORD_GUILD_ID=745376918030909471
DISCORD_ENABLED=true
```

**Rebuild after changes:**
```bash
cd ~/.claude/discordmcp
npm run build
```

### GladOSv3 (tjr-suite) Configuration

**Files:**
- **Token:** `~/Dev/tjr-suite/.env`
- **Source:** `~/Dev/tjr-suite/packages/app/src/services/discord/`
- **HTTP API:** Running on `http://localhost:3000`

**Environment Variables:**
```env
DISCORD_TOKEN=MTQyNTg1MDgzNjI3NzM5NTUwNg...
DISCORD_CLIENT_ID=1425850836277395506
DISCORD_GUILD_ID=745376918030909471
DISCORD_ENABLED=true
```

**Note:** GladOSv3 is always running as part of tjr-suite. Do not confuse with Sombra.

## Common Channel IDs

**Nice Wolf Studio Server:**
- **Guild ID:** 745376918030909471
- **#bot-testing-grounds:** 1420759585349697710

## Permission Reference

### Required Bot Permissions

**Minimum (for message sending):**
- View Channels (1024)
- Send Messages (2048)

**Recommended:**
- Read Message History (65536)
- Add Reactions (64)

**Permission Integer:** 69632 (includes all recommended)

### How to Calculate Custom Permissions

Visit: https://discordapi.com/permissions.html

Enter desired permissions, copy the integer for OAuth2 URL.

## Testing Checklist

When setting up or troubleshooting Discord integration:

- [ ] Bot token is valid (test with `/users/@me` endpoint)
- [ ] Bot is in the correct server (check `/users/@me/guilds`)
- [ ] Bot has View Channel permission
- [ ] Bot has Send Messages permission in target channel
- [ ] Channel ID is correct (17-19 digit number)
- [ ] Token configured in correct .env file
- [ ] MCP server built (if using MCP tools)
- [ ] Claude Code restarted (if using MCP tools)

## Quick Reference Commands

### Verify Token
```bash
curl -H "Authorization: Bot TOKEN" https://discord.com/api/v10/users/@me
```

### List Guilds
```bash
curl -H "Authorization: Bot TOKEN" https://discord.com/api/v10/users/@me/guilds
```

### Test MCP Server
```bash
cd ~/.claude/discordmcp && node build/index.js
```

### Send via Gateway Script
```bash
cd ~/.claude/discordmcp && node send-test-message.js CHANNEL_ID "Message"
```

### Check MCP Config
```bash
grep -A 5 '"discord"' ~/.claude/mcp.json
```

## Examples

See `examples.md` in this skill directory for complete working examples.

## Related Documentation

- **Setup Guide:** `~/.claude/discordmcp/SETUP_COMPLETE.md`
- **Validation Report:** `~/.claude/discordmcp/VALIDATION_REPORT.md`
- **Gateway Script:** `~/.claude/discordmcp/send-test-message.js`
- **Discord.js Docs:** https://discord.js.org/
- **Discord API:** https://discord.com/developers/docs

---

## After Using This Skill

**REQUIRED NEXT STEPS:**

1. **Verify message sent successfully** - Check verification checklist (6 items) to confirm integration worked
2. **Document method used** - Record which method succeeded (MCP/Gateway/REST) for future reference
3. **Test error handling** - Verify fallback logic works if primary method fails

**OPTIONAL NEXT STEPS:**

- **Set up logging** - Track Discord API calls, errors, and response times for debugging
- **Create reusable wrapper** - Build abstraction around working method for consistent usage
- **Monitor bot health** - Set up alerts for token expiration or permission changes

---

## Changelog

### Version 1.0.1 (2025-11-14)
- **Added** superpowers-style improvements for better agent guidance
- **Added** "When NOT to Use" section to prevent misuse
- **Enhanced** Integration Method Selection with MANDATORY fallback logic
- **Added** "Red Flags - STOP" section with 6 common anti-patterns
- **Added** "Verification Checklist" for completion validation
- **Improved** frontmatter with version, triggers, and clearer description
- **Updated** description to emphasize automatic fallback and OAuth scope issue prevention

### Version 1.0.0 (Initial)
- Initial discord-integration skill
- Three-tier integration methods (MCP, Gateway, REST API)
- Comprehensive troubleshooting for common errors
- Configuration reference for Sombra and GladOSv3 bots

Files in this skill

  • SKILL.md16.5 KB
  • source.json742 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.