Claude Skills Guide

Discord MCP Server Community Automation Guide

Building community automation for Discord with the Model Context Protocol (MCP) opens up powerful workflows for developers managing online communities. This guide covers practical implementation patterns, configuration examples, and real-world automation scenarios using MCP servers with Discord bots.

Understanding the MCP-Discord Connection

MCP servers extend Claude Code’s capabilities by exposing tools that interact with external services. When you combine MCP with Discord’s API, you create a bridge between Claude’s reasoning capabilities and your community management tasks. This means Claude can read messages, manage roles, moderate content, and respond to community events without manual intervention.

The key components involve setting up a Discord bot, configuring an MCP server to communicate with Discord’s API, and defining the automation rules that Claude follows.

Setting Up Your Discord Bot

Before integrating with MCP, you need a Discord bot with appropriate permissions. Create one through the Discord Developer Portal and grant these intents:

Install your bot to your server and note the token. Store this securely—you will reference it in your MCP server configuration.

Creating the MCP Server Structure

A basic Discord MCP server requires a few key files. Here is a minimal implementation using Node.js:

// mcp-discord-server/index.js
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { Client, GatewayIntentBits, Events } from 'discord.js';

const discordClient = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
    GatewayIntentBits.GuildMembers
  ]
});

const server = new Server({
  name: 'discord-community-manager',
  version: '1.0.0'
}, {
  capabilities: {
    tools: {}
  }
});

// Tool: Send welcome message to new member
server.setRequestHandler('tools/list', async () => {
  return {
    tools: [
      {
        name: 'welcome_new_member',
        description: 'Send a personalized welcome message to a new server member',
        inputSchema: {
          type: 'object',
          properties: {
            userId: { type: 'string', description: 'Discord user ID' },
            channelId: { type: 'string', description: 'Welcome channel ID' }
          },
          required: ['userId', 'channelId']
        }
      },
      {
        name: 'assign_role',
        description: 'Assign a role to a user based on activity or verification',
        inputSchema: {
          type: 'object',
          properties: {
            userId: { type: 'string' },
            roleId: { type: 'string' }
          },
          required: ['userId', 'roleId']
        }
      },
      {
        name: 'moderate_message',
        description: 'Delete a message and optionally warn the user',
        inputSchema: {
          type: 'object',
          properties: {
            messageId: { type: 'string' },
            channelId: { type: 'string' },
            reason: { type: 'string' }
          },
          required: ['messageId', 'channelId']
        }
      }
    ]
  };
});

server.setRequestHandler('tools/call', async (request) => {
  const { name, arguments: args } = request.params;

  switch (name) {
    case 'welcome_new_member': {
      const channel = await discordClient.channels.fetch(args.channelId);
      const user = await discordClient.users.fetch(args.userId);
      await channel.send(`Welcome ${user}! Check out our rules and introduce yourself.`);
      return { content: [{ type: 'text', text: 'Welcome message sent' }] };
    }
    case 'assign_role': {
      const guild = discordClient.guilds.first();
      const member = await guild.members.fetch(args.userId);
      const role = guild.roles.cache.get(args.roleId);
      await member.roles.add(role);
      return { content: [{ type: 'text', text: 'Role assigned' }] };
    }
    case 'moderate_message': {
      const channel = discordClient.channels.cache.get(args.channelId);
      const message = await channel.messages.fetch(args.messageId);
      await message.delete();
      return { content: [{ type: 'text', text: 'Message deleted' }] };
    }
  }
});

discordClient.login(process.env.DISCORD_TOKEN);
const transport = new StdioServerTransport();
await server.connect(transport);

Configuring Claude Code to Use Your Server

Add the Discord MCP server to your ~/.claude/settings.json:

{
  "mcpServers": {
    "discord-community": {
      "command": "node",
      "args": ["/path/to/mcp-discord-server/index.js"],
      "env": {
        "DISCORD_TOKEN": "your-bot-token-here"
      }
    }
  }
}

Restart Claude Code, and the Discord tools become available in your sessions.

Practical Automation Workflows

With the MCP server running, you can create powerful community automation workflows.

Automated Welcome System

Combine the welcome_new_member tool with Discord’s member join events. When a new member joins, Claude can send a personalized greeting, assign a “New Member” role, and post an introduction prompt in your welcome channel. This creates a consistent onboarding experience without manual moderation.

Role Assignment Based on Activity

Track message counts and assign roles automatically. A common pattern involves users earning roles after posting a certain number of messages or completing verification steps. The assign_role tool integrates with your activity tracking logic:

// Example: Check activity and assign roles
async function checkMemberActivity(guild, memberId) {
  const messageCount = await getMessageCount(memberId); // Your tracking logic
  const roleId = messageCount > 50 ? 'verified-member-role-id' : null;
  
  if (roleId) {
    // This calls the MCP tool
    await callMcpTool('assign_role', { userId: memberId, roleId });
  }
}

Content Moderation

The moderate_message tool enables automated moderation. Integrate with content filters to automatically delete messages containing spam, prohibited content, or links to malicious sites. You can layer in warning systems that notify users before taking action:

// Simple spam filter example
async function moderateMessage(message) {
  const spamPatterns = ['http://suspicious-link.com', 'buy followers'];
  const isSpam = spamPatterns.some(pattern => 
    message.content.toLowerCase().includes(pattern.toLowerCase())
  );
  
  if (isSpam) {
    await callMcpTool('moderate_message', {
      messageId: message.id,
      channelId: message.channelId,
      reason: 'Automated spam detection'
    });
    return true;
  }
  return false;
}

Advanced: Connecting Multiple Skills

The real power emerges when you combine Discord MCP automation with other Claude skills. Pair the tdd skill with your Discord server to automatically generate test cases for your bot’s moderation logic. Use the pdf skill to generate weekly community reports summarizing member activity, message volumes, and moderation actions.

The supermemory skill works well for maintaining community knowledge bases—Claude can automatically document community events, FAQ responses, and policy decisions into a searchable knowledge base that your moderation team can reference. If your community has a web portal, the frontend-design skill can help generate UI components for moderation dashboards.

Security Considerations

When building Discord automation, keep these security practices in mind:

Deployment Options

For production deployments, consider containerizing your MCP server:

FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
ENV DISCORD_TOKEN=${DISCORD_TOKEN}
CMD ["node", "index.js"]

This containerized approach makes it easier to manage dependencies and scale your automation across multiple servers.

Summary

Discord MCP server automation transforms community management from manual moderation to intelligent, programmable workflows. Start with basic welcome messages and role assignments, then expand into sophisticated content moderation and analytics. The key is building on solid fundamentals: secure token handling, proper permission scopes, and thoughtful automation rules that enhance rather than replace human community managers.

The combination of MCP’s tool framework with Discord’s API creates endless possibilities for scaling community engagement while maintaining the personal touch that makes Discord communities thrive.


Built by theluckystrike — More at zovo.one