limitless-reign-mcp
Limitless Reign MCP
AI-Powered Discord Bot Control | 280+ Tools | Works with Claude, ChatGPT, Cursor
Why Limitless Reign MCP?
Stop writing Discord bot commands. Just tell AI what you want.
You: "Set up my gaming server with channels and automod"
AI: ✓ Created #rules, #announcements, #general
✓ Created Gaming voice channels
✓ Set up automod for spam/slurs
✓ Created Moderator and Member roles
Done! Your server is ready.The most complete Discord MCP integration:
116 Discord tools - Every Discord.js v14 API
Any AI client - Claude, ChatGPT, Cursor, Windsurf, GPT Actions
Zero config - One command to start
Open source - MIT license, free forever
🚀 One Command Setup
npx limitless-reign --token YOUR_BOT_TOKENThat's it. Server runs at http://localhost:3000. Connect your AI and go.
Create app or select existing
Go to Bot → Reset Token → Copy
Add bot to server with Administrator permission
🎯 What AI Can Do
Messages & Content
Ask AI | What Happens |
"Announce the new update in #general" | Sends formatted message |
"Create a poll: What game tonight?" | Creates interactive poll |
"Delete spam from the last hour" | Bulk deletes messages |
"Pin the rules message" | Pins to channel |
Server Setup
Ask AI | What Happens |
"Create a gaming server layout" | Creates categories + channels |
"Set up roles for staff and members" | Creates role hierarchy |
"Make #admin visible only to mods" | Sets channel permissions |
"Add automod to block spam" | Creates automod rules |
Member Management
Ask AI | What Happens |
"Timeout toxic_user for 1 day" | Applies timeout |
"Give VIP role to our supporters" | Adds roles to members |
"Kick inactive members" | Removes members |
"Who has the Admin role?" | Lists members |
Advanced
Ask AI | What Happens |
"Create a /announce command" | Registers slash command |
"Set up a webhook for alerts" | Creates webhook |
"Schedule game night for Friday" | Creates event |
"Add trending emojis from emoji.gg" | Imports emojis |
📋 All 283 Tools
Tool | Description |
| Bot user details, guild count, uptime, and ready status |
| Gateway ping, connection status, shard count |
| Online/idle/dnd/invisible status |
| Playing/streaming/listening/watching/custom activity |
| Gracefully disconnect bot from gateway |
Tool | Description |
| Send a private DM to a user |
| Edit a private DM |
| Delete a private DM |
| Read DM message history with user |
Tool | Description |
| List your authorized servers |
| List accessible servers |
| Server details & features |
| Edit server settings & icons |
| Comprehensive stats (humans, bots, voice active, channels, boost tier) |
| Get public preview of discoverable server |
| List voice RTC regions |
| List all active threads across server |
| Modify vanity invite code |
| Get raid alerts & incident state |
| Configure raid alerts & disable invites/DMs |
| Get verification & safety requirements |
| Get server 2FA/MFA moderation level |
| Get server NSFW classification |
| List channels |
| List roles |
| List emojis |
| List stickers |
| List invites |
| List webhooks |
| List bans |
| Audit log |
| Vanity URL |
| Leave server |
| Apply predefined template |
| Preview inactive member prune count |
| Prune inactive members |
| Get server widget embed & settings |
| Enable/disable widget & channel |
| Community welcome screen info |
| Edit welcome screen & channels |
| Get community onboarding flow |
| Edit onboarding questions & default channels |
| List Twitch/YouTube/bot integrations |
| Delete server integration |
Tool | Description |
| Get native template by code |
| List server's native templates |
| Create template from server |
| Sync template with server layout |
| Edit template name & description |
| Delete server template |
| Create new guild from template |
Tool | Description |
| Create any channel type |
| Edit settings |
| Delete channel |
| Clone with settings |
| Find channel by name & type |
| Get channel details |
| Move channel to category/position |
| Lock channel to prevent member messages |
| Unlock a locked channel |
| Set or remove channel slowmode delay |
| Update channel topic |
| Reorder multiple channels |
| Sync permissions with parent category |
| Create voice channel |
| Create stage channel |
| Edit voice/stage settings |
| List connected members in voice channel with audio/video status |
| Snapshot of all active voice channels & users in server |
| Set permissions overwrite |
| List channel overwrites |
| Delete channel overwrite |
| Create invite link |
| Revoke invite link |
| Get invite details & stats |
Tool | Description |
| Create new category |
| Edit category name/position |
| Delete category |
| Find category by name |
| List category's channels |
Tool | Description |
| Create forum channel |
| Edit forum settings/tags |
| List forum channels |
| Forum settings & tags |
| List available tags |
| List active posts |
| Create forum post |
| Edit tags, pin/unpin, lock, archive forum post |
| Create thread |
| Get full thread metadata & counts |
| Edit thread |
| Delete thread |
| Lock thread to prevent new replies |
| Unlock thread |
| Archive thread |
| Unarchive thread |
| List active threads |
| List public archived threads |
| List private archived threads |
| List joined private archived threads |
| Bot joins thread |
| Bot leaves thread |
| Add user to thread |
| Remove user from thread |
| Get user thread membership |
| List all thread members |
Tool | Description |
| Send with embeds/buttons |
| Rich embed |
| Components V2 |
| Fetch single message |
| Referenced inline reply |
| Trigger typing indicator |
| Upload files with message |
| Retrieve file attachment metadata & URL |
| Forward message using snapshots |
| Edit message |
| Delete message |
| Bulk delete |
| Fetch messages |
| Search messages across channel or server with keyword & author filters |
| Fetch last 100-500 messages sent by a specific user across channels |
| Export full message transcript from channel |
| Publish announcement message to follower channels |
| Follow announcement channel to auto-receive posts |
| Get all pinned messages in channel |
| Pin message |
| Unpin message |
| Get users who reacted with emoji |
| Add reaction |
| Remove reaction |
| Clear all reactions for emoji |
| Remove every reaction from message |
| Create poll |
| Immediately expire active poll |
| List voters for poll answer |
Tool | Description |
| Fetch global Discord user profile, avatar, banner |
| Full profile: bio, custom status, rich presence games/Spotify, desktop/mobile status |
| Edit bot username or avatar globally |
| Get bot's server member & permissions |
| Change bot server nickname |
| Member info |
| Search members |
| List members |
| Get user ID for |
| Get expanded role list for member |
| Find all members holding a role |
| Resolve server-specific avatar/banner |
| Calculate channel effective permissions |
| Kick |
| Ban |
| Native bulk ban multiple users |
| Unban |
| Timeout |
| Remove timeout |
| Add role |
| Remove role |
| Set nickname |
| Move to voice |
| Disconnect from voice |
| Server mute |
| Server deafen |
| Mute/deafen/suppress in voice |
Tool | Description |
| Create role |
| Get detailed role settings, permissions, icon |
| Edit role |
| Delete role |
| Set single role position |
| Reorder role hierarchy |
| List members holding role |
| Get @everyone role & permissions |
| Set role icon image |
| Set role emoji |
| Compute effective member permissions |
| List permissions |
Tool | Description |
| Create emoji |
| Emoji details & author |
| Rename or role-restrict emoji |
| Delete emoji |
| Create sticker |
| Get sticker details |
| Edit sticker name/description/tags |
| Delete sticker |
| Search emoji.gg |
| Add from emoji.gg |
Tool | Description |
| Create webhook |
| Get webhook details by ID |
| List all webhooks in channel |
| Edit webhook name, avatar, or channel |
| Delete webhook |
| Send via webhook |
| Send webhook message & return created object |
| Send into thread or create forum post |
| Send Slack-compatible webhook payload |
| Send GitHub-compatible webhook payload |
| Fetch webhook message |
| Edit webhook message |
| Delete webhook message |
Tool | Description |
| List rules |
| Get single rule details |
| Create rule |
| Edit rule & filters |
| Delete rule |
Tool | Description |
| Get active stage instance details |
| Start/open a stage instance with topic |
| Edit active stage topic/privacy |
| Close/end a stage instance |
Tool | Description |
| List custom soundboard sounds |
| Get soundboard sound details |
| Upload custom soundboard audio |
| Edit sound name/volume/emoji |
| Delete soundboard sound |
| Play soundboard audio in voice channel |
| List Discord default soundboard sounds |
Tool | Description |
| Create event |
| Fetch event details & interested user count |
| Edit event & status |
| List events |
| List interested users |
| Delete event |
Tool | Description |
| Create global command |
| Fetch single global command |
| List global commands |
| Edit global command |
| Delete global command |
| Bulk overwrite all global commands |
| Create guild command |
| Fetch single guild command |
| List guild commands |
| Edit guild command |
| Delete guild command |
| Bulk overwrite all guild commands |
| Get command permissions |
| Set command permissions |
| Batch edit permissions for commands |
Tool | Description |
| Reply to interaction |
| Defer interaction ("thinking...") |
| Edit initial interaction reply |
| Delete initial interaction reply |
| Send interaction follow-up |
| Fetch interaction follow-up |
| Edit interaction follow-up |
| Delete interaction follow-up |
| Respond to autocomplete suggestions |
| Open modal popup |
| Create activity link in voice channel |
Tool | Description |
| Subscribe to gateway events |
| Unsubscribe from gateway events |
| List active event subscriptions |
| Wait/poll until specific event occurs |
| Query recent events buffer with filters |
| Automated message handler |
| Automated reaction handler |
| Automated member join/leave handler |
| Automated voice state handler |
| Automated thread handler |
| Automated interaction handler |
| Remove automated handler |
Tool | Description |
| Connect bot to voice or stage channel (Opcode 4 Gateway WebRTC) |
| Disconnect bot from active voice channel |
| Get bot voice state, active playback track, and volume |
| Stream audio from YouTube, Spotify, SoundCloud, or direct URLs |
| Stream direct audio URL (.mp3, .wav, .ogg, .aac, .mp4 stream) |
| Play local sound file from disk into voice channel |
| Synthesize text to speech and speak in voice channel |
| Pause active audio playback |
| Resume paused audio playback |
| Stop audio playback and clear track |
| Adjust playback volume (0–200%) |
| Multi-track voice recording (all speakers + separate per-user tracks + user filters) |
| Stop recording, finalize |
| List saved voice channel audio recordings on disk |
Tool | Description |
| SQL query on local SQLite |
| Execute SQL statement |
| List tables in DB |
| Get table schema |
| Query action logs |
| Get guild config |
| Update guild config |
| Database stats |
| Schedule cron task |
| List scheduled tasks |
| Cancel scheduled task |
Tool | Description |
| Universal parser for URLs, mentions ( |
| Preflight check for bot permissions & role hierarchy before executing destructive actions |
| Execute multiple independent MCP tool calls concurrently with per-operation results |
| Inspect active Gateway intents, privileged flags, voice readiness, and REST API version |
| Convert web URLs or local images into Discord base64 Data URIs for emojis/stickers/icons |
| Add OAuth2-authorized user to a server using their OAuth access token |
| Raw Discord REST API call ( |
🎙️ Live Voice Streaming & Multi-Track Audio Recording
Limitless Reign includes a full WebRTC Audio Pipeline (@discordjs/voice) allowing AI models to stream music, speak TTS, and record multi-user voice conversations with individual per-speaker tracks.
1. Connect & Stream Music / Audio
// 1. Join Voice Channel
{
"tool": "discord_join_voice_channel",
"arguments": {
"guildId": "1532381127564857484",
"channelId": "1537206459102666803"
}
}
// 2. Stream YouTube, Spotify, or Direct MP3
{
"tool": "discord_play_audio",
"arguments": {
"guildId": "1532381127564857484",
"source": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Never Gonna Give You Up"
}
}
// 3. Adjust Volume
{
"tool": "discord_set_audio_volume",
"arguments": {
"guildId": "1532381127564857484",
"volume": 75
}
}2. Pure In-Memory Multi-Track Recording (Zero Disk Required)
// Start Recording (buffered purely in memory with optional exclusion filters)
{
"tool": "discord_start_voice_recording",
"arguments": {
"guildId": "1532381127564857484",
"multiTrack": true,
"excludedUserIds": ["123456789012345678"] // Ignore bots or noisy users
}
}
// Stop Recording & optionally upload directly to a Discord text channel
{
"tool": "discord_stop_voice_recording",
"arguments": {
"guildId": "1532381127564857484",
"sendToChannelId": "1532381127564857486" // Optional: uploads in-memory buffer as Discord attachment message
}
}Response Output (In-Memory Base64 Data URIs & CDN Attachment):
{
"success": true,
"data": {
"recording": {
"id": "rec_1788029582",
"durationSeconds": 45,
"sizeBytes": 542100,
"status": "completed",
"attachmentUrl": "https://cdn.discordapp.com/attachments/.../rec_1788029582_recording.opus",
"dataUri": "data:audio/ogg;codecs=opus;base64,T3B1c0hlYWQ...",
"tracks": [
{
"name": "Master Combined Track (All Speakers)",
"sizeBytes": 542100,
"dataUri": "data:audio/ogg;codecs=opus;base64,..."
},
{
"userId": "1136967689517142087",
"name": "Speaker Track (User 1136967689517142087)",
"sizeBytes": 271000,
"dataUri": "data:audio/ogg;codecs=opus;base64,..."
}
]
}
}
}🔌 Connect Any AI
Claude Desktop
Edit claude_desktop_config.json:
Windows: %APPDATA%\Claude\claude_desktop_config.json
Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"discord": {
"url": "http://localhost:3000"
}
}
}Claude Code
Install package and use the skill:
npm install limitless-reign-mcpThen type /limitless-reign in Claude Code.
ChatGPT
Web Plugin: Settings → Security → Developer Mode → Plugins → Add:
http://localhost:3000/sseDesktop: Settings → Integrations → Add MCP Server → Streamable HTTP:
http://localhost:3000Cursor / Windsurf
Settings → Features → MCP → Add Server:
URL: http://localhost:3000GPT Actions
Get OpenAPI schema:
GET http://localhost:3000?format=openapiPaste in Custom GPT → Configure → Actions
💻 SDK Usage
Works with any backend framework. Just create the MCP server and mount it.
Core Setup (All Frameworks)
import { Client, GatewayIntentBits } from 'discord.js'
import { createMCPServer } from 'limitless-reign-mcp'
const client = new Client({
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers]
})
const mcp = createMCPServer({
client,
validateAccess: async (apiKey, guildId) => {
// Your auth logic
return { valid: true, userId: 'user-id' }
},
getAllowedGuilds: async (apiKey) => {
return [{ id: '123', name: 'My Server', icon: null }]
}
})
await client.login(process.env.DISCORD_TOKEN)Express
import express from 'express'
import { expressMiddleware } from 'limitless-reign-mcp'
const app = express()
app.use(express.json())
app.use('/mcp', expressMiddleware(mcp))
app.listen(3000)Next.js (App Router)
// lib/mcp.ts
import { createMCPServer } from 'limitless-reign-mcp'
let mcp: ReturnType<typeof createMCPServer>
export async function getMCP() {
if (!mcp) {
// ... setup client
mcp = createMCPServer({ client, validateAccess, getAllowedGuilds })
}
return mcp
}// app/api/mcp/route.ts
import { createNextjsRoute } from 'limitless-reign-mcp'
import { getMCP } from '@/lib/mcp'
export const { GET, POST, OPTIONS } = createNextjsRoute(getMCP)// app/api/mcp/sse/route.ts
import { createNextjsSSERoute } from 'limitless-reign-mcp'
import { getMCP } from '@/lib/mcp'
export const { GET, POST, OPTIONS } = createNextjsSSERoute(getMCP)Fastify
import Fastify from 'fastify'
import { handleHTTPRequest } from 'limitless-reign-mcp'
const app = Fastify()
app.all('/mcp', async (req, reply) => {
const result = await handleHTTPRequest(mcp, {
method: req.method,
url: req.url,
headers: req.headers as Record<string, string>,
body: req.body,
basePath: '/mcp'
})
reply.status(result.status).send(result.body)
})
app.listen({ port: 3000 })Hono
import { Hono } from 'hono'
import { handleHTTPRequest } from 'limitless-reign-mcp'
const app = new Hono()
app.all('/mcp', async (c) => {
const result = await handleHTTPRequest(mcp, {
method: c.req.method,
url: c.req.url,
headers: Object.fromEntries(c.req.raw.headers),
body: await c.req.json().catch(() => null),
basePath: '/mcp'
})
return c.json(result.body, result.status)
})
export default appKoa
import Koa from 'koa'
import Router from '@koa/router'
import bodyParser from 'koa-bodyparser'
import { handleHTTPRequest } from 'limitless-reign-mcp'
const app = new Koa()
const router = new Router()
router.all('/mcp', async (ctx) => {
const result = await handleHTTPRequest(mcp, {
method: ctx.method,
url: ctx.href,
headers: ctx.headers as Record<string, string>,
body: ctx.request.body,
basePath: '/mcp'
})
ctx.status = result.status
ctx.body = result.body
})
app.use(bodyParser())
app.use(router.routes())
app.listen(3000)Bun
import { handleHTTPRequest } from 'limitless-reign-mcp'
Bun.serve({
port: 3000,
async fetch(req) {
const url = new URL(req.url)
if (url.pathname.startsWith('/mcp')) {
const result = await handleHTTPRequest(mcp, {
method: req.method,
url: req.url,
headers: Object.fromEntries(req.headers),
body: await req.json().catch(() => null),
basePath: '/mcp'
})
return Response.json(result.body, { status: result.status })
}
return new Response('Not found', { status: 404 })
}
})Deno
import { handleHTTPRequest } from 'npm:limitless-reign-mcp'
Deno.serve({ port: 3000 }, async (req) => {
const url = new URL(req.url)
if (url.pathname.startsWith('/mcp')) {
const result = await handleHTTPRequest(mcp, {
method: req.method,
url: req.url,
headers: Object.fromEntries(req.headers),
body: await req.json().catch(() => null),
basePath: '/mcp'
})
return Response.json(result.body, { status: result.status })
}
return new Response('Not found', { status: 404 })
})Node.js HTTP (No Framework)
import http from 'http'
import { handleHTTPRequest } from 'limitless-reign-mcp'
http.createServer(async (req, res) => {
let body = ''
for await (const chunk of req) body += chunk
const result = await handleHTTPRequest(mcp, {
method: req.method!,
url: `http://localhost:3000${req.url}`,
headers: req.headers as Record<string, string>,
body: body ? JSON.parse(body) : null,
basePath: '/mcp'
})
res.writeHead(result.status, { 'Content-Type': 'application/json' })
res.end(JSON.stringify(result.body))
}).listen(3000)🧩 Adding Custom & External Tools
Limitless Reign MCP is fully extensible. You can add custom tools, external HTTP REST APIs, bridge remote MCP servers, and write modular plugins using 6 different methods:
1. Server Configuration (customTools option)
Pass custom tools directly when creating your server:
import { createMCPServer } from 'limitless-reign-mcp'
const mcp = createMCPServer({
client,
validateAccess: async (key) => ({ valid: true }),
customTools: [
{
name: 'calculate_stats',
description: 'Compute server analytics score',
inputSchema: {
type: 'object',
properties: {
multiplier: { type: 'number', description: 'Score multiplier' }
},
required: ['multiplier']
},
handler: async (args, { client, database }) => {
const memberCount = client.guilds.cache.reduce((acc, g) => acc + g.memberCount, 0)
return { totalMembers: memberCount, score: memberCount * args.multiplier }
}
}
]
})2. Runtime Registration (mcp.registerTool & mcp.registerTools)
Register or unregister custom tools dynamically at any point:
import { defineTool } from 'limitless-reign-mcp'
// Register a single custom tool
mcp.registerTool(
defineTool({
name: 'custom_send_alert',
description: 'Send high priority alert to moderator channel',
inputSchema: {
type: 'object',
properties: {
channelId: { type: 'string' },
alertMessage: { type: 'string' }
},
required: ['channelId', 'alertMessage']
},
handler: async (args, { client }) => {
const channel = await client.channels.fetch(args.channelId)
if (channel?.isTextBased()) {
await channel.send(`🚨 **ALERT:** ${args.alertMessage}`)
return { success: true, delivered: true }
}
return { success: false, error: 'Channel is not text-based' }
}
})
)
// Check or unregister tools
mcp.hasTool('custom_send_alert') // true
mcp.unregisterTool('custom_send_alert')3. External HTTP / REST API Tools (createHttpTool)
Turn any REST API endpoint or Webhook into an MCP tool with schema validation and authentication:
import { createHttpTool } from 'limitless-reign-mcp'
const weatherTool = createHttpTool({
name: 'get_weather_report',
description: 'Fetch current weather for a city',
url: (args) => `https://api.weatherapi.com/v1/current.json?q=${encodeURIComponent(args.city)}&key=YOUR_API_KEY`,
method: 'GET',
inputSchema: {
type: 'object',
properties: {
city: { type: 'string', description: 'City name' }
},
required: ['city']
},
transformResponse: (data) => ({
city: data.location?.name,
temp_c: data.current?.temp_c,
condition: data.current?.condition?.text
})
})
mcp.registerTool(weatherTool)4. Bridge & Proxy External MCP Servers (registerExternalMCP)
Seamlessly connect remote MCP servers (such as GitHub MCP, Database MCP, or Web Search MCP) and merge their tools into your Discord MCP catalog:
// Proxy an external MCP server over HTTP/SSE
await mcp.registerExternalMCP({
url: 'http://localhost:8080/mcp',
prefix: 'ext_', // Optional prefix to avoid tool name clashes
headers: {
'Authorization': 'Bearer YOUR_REMOTE_TOKEN'
},
filterTools: (toolName) => !toolName.startsWith('dangerous_')
})5. Modular Plugins (mcp.use)
Package and organize custom tools into reusable plugins:
import type { DiscordMCPServer } from 'limitless-reign-mcp'
function moderationPlugin(server: DiscordMCPServer) {
server.registerTool({
name: 'auto_quarantine_user',
description: 'Move user to isolated quarantine role',
inputSchema: {
type: 'object',
properties: {
guildId: { type: 'string' },
userId: { type: 'string' }
},
required: ['guildId', 'userId']
},
handler: async (args, { client }) => {
// Your custom quarantine logic
return { quarantined: true, userId: args.userId }
}
})
}
mcp.use(moderationPlugin)6. CLI Dynamic Loading (--tools, --plugin, --external-mcp)
When using the standalone CLI, pass custom tools, plugins, or external MCP servers via command line flags or environment variables:
# Load custom tools file
npx limitless-reign --token YOUR_BOT_TOKEN --tools ./my-tools.js
# Load a plugin
npx limitless-reign --token YOUR_BOT_TOKEN --plugin ./my-plugin.js
# Proxy a remote MCP server
npx limitless-reign --token YOUR_BOT_TOKEN --external-mcp http://localhost:8000/mcp🛡️ Access Control
Built-in permission system:
validateAccess: async (apiKey, guildId) => {
const user = await db.users.findByApiKey(apiKey)
if (!user) {
return { valid: false, error: 'Invalid API key' }
}
if (guildId && !user.hasAccessTo(guildId)) {
return { valid: false, error: 'No access to this server' }
}
return { valid: true, userId: user.id }
}📦 What's Included
File | Purpose |
| CLI - |
| SDK exports |
| Claude Code skill |
| AI instructions |
| Agent documentation |
🔗 Links
Issues: Report bugs
Limitless Reign App: github.com/aayushchouhan24/limitless-reign-mcp
⭐ Star This Repo
If this helped you, give it a star! It helps others find it.
🌟 Author
🤝 Contributing
Contributions are welcome! Feel free to:
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'Add amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
📄 License
MIT © Aayush Chouhan