@quadslab.io/discord-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +474 -0
  3. package/dist/discord-client.d.ts +57 -0
  4. package/dist/discord-client.js +188 -0
  5. package/dist/discord-client.js.map +1 -0
  6. package/dist/index.d.ts +9 -0
  7. package/dist/index.js +135 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/mcp-server.d.ts +15 -0
  10. package/dist/mcp-server.js +65 -0
  11. package/dist/mcp-server.js.map +1 -0
  12. package/dist/tools/automod.d.ts +6 -0
  13. package/dist/tools/automod.js +376 -0
  14. package/dist/tools/automod.js.map +1 -0
  15. package/dist/tools/channels.d.ts +6 -0
  16. package/dist/tools/channels.js +840 -0
  17. package/dist/tools/channels.js.map +1 -0
  18. package/dist/tools/emojis.d.ts +6 -0
  19. package/dist/tools/emojis.js +295 -0
  20. package/dist/tools/emojis.js.map +1 -0
  21. package/dist/tools/events.d.ts +6 -0
  22. package/dist/tools/events.js +304 -0
  23. package/dist/tools/events.js.map +1 -0
  24. package/dist/tools/forums.d.ts +6 -0
  25. package/dist/tools/forums.js +276 -0
  26. package/dist/tools/forums.js.map +1 -0
  27. package/dist/tools/guild.d.ts +6 -0
  28. package/dist/tools/guild.js +88 -0
  29. package/dist/tools/guild.js.map +1 -0
  30. package/dist/tools/index.d.ts +13 -0
  31. package/dist/tools/index.js +142 -0
  32. package/dist/tools/index.js.map +1 -0
  33. package/dist/tools/members.d.ts +6 -0
  34. package/dist/tools/members.js +628 -0
  35. package/dist/tools/members.js.map +1 -0
  36. package/dist/tools/messages.d.ts +6 -0
  37. package/dist/tools/messages.js +688 -0
  38. package/dist/tools/messages.js.map +1 -0
  39. package/dist/tools/reactions.d.ts +6 -0
  40. package/dist/tools/reactions.js +137 -0
  41. package/dist/tools/reactions.js.map +1 -0
  42. package/dist/tools/roles.d.ts +6 -0
  43. package/dist/tools/roles.js +469 -0
  44. package/dist/tools/roles.js.map +1 -0
  45. package/dist/tools/server.d.ts +6 -0
  46. package/dist/tools/server.js +607 -0
  47. package/dist/tools/server.js.map +1 -0
  48. package/dist/tools/stage.d.ts +6 -0
  49. package/dist/tools/stage.js +153 -0
  50. package/dist/tools/stage.js.map +1 -0
  51. package/dist/tools/threads.d.ts +6 -0
  52. package/dist/tools/threads.js +331 -0
  53. package/dist/tools/threads.js.map +1 -0
  54. package/dist/tools/utils.d.ts +21 -0
  55. package/dist/tools/utils.js +315 -0
  56. package/dist/tools/utils.js.map +1 -0
  57. package/dist/tools/webhooks.d.ts +6 -0
  58. package/dist/tools/webhooks.js +195 -0
  59. package/dist/tools/webhooks.js.map +1 -0
  60. package/package.json +48 -0
@@ -0,0 +1,6 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ /**
3
+ * Stage instance management tools
4
+ */
5
+ export declare const stageTools: Tool[];
6
+ export declare function executeStageTool(name: string, args: Record<string, unknown>): Promise<string>;
@@ -0,0 +1,153 @@
1
+ import { getGuild } from '../discord-client.js';
2
+ import { smartFindChannel } from './utils.js';
3
+ import { ChannelType, StageInstancePrivacyLevel } from 'discord.js';
4
+ /**
5
+ * Stage instance management tools
6
+ */
7
+ export const stageTools = [
8
+ {
9
+ name: 'list_stage_instances',
10
+ description: 'List all active stage instances in the Discord server. Returns details including topic, channel, and privacy level.',
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: {},
14
+ required: [],
15
+ },
16
+ },
17
+ {
18
+ name: 'start_stage',
19
+ description: 'Start a new stage instance on a stage channel. Requires specifying a stage voice channel and a topic.',
20
+ inputSchema: {
21
+ type: 'object',
22
+ properties: {
23
+ channel: {
24
+ type: 'string',
25
+ description: 'The stage channel name or ID (fuzzy matched)',
26
+ },
27
+ topic: {
28
+ type: 'string',
29
+ description: 'The topic for the stage instance',
30
+ },
31
+ sendNotification: {
32
+ type: 'boolean',
33
+ description: 'Whether to send a start notification to the server (default: false)',
34
+ },
35
+ },
36
+ required: ['channel', 'topic'],
37
+ },
38
+ },
39
+ {
40
+ name: 'end_stage',
41
+ description: 'End an active stage instance on a stage channel.',
42
+ inputSchema: {
43
+ type: 'object',
44
+ properties: {
45
+ channel: {
46
+ type: 'string',
47
+ description: 'The stage channel name or ID (fuzzy matched)',
48
+ },
49
+ },
50
+ required: ['channel'],
51
+ },
52
+ },
53
+ ];
54
+ export async function executeStageTool(name, args) {
55
+ switch (name) {
56
+ case 'list_stage_instances':
57
+ return await listStageInstances();
58
+ case 'start_stage':
59
+ return await startStage(args);
60
+ case 'end_stage':
61
+ return await endStage(args);
62
+ default:
63
+ throw new Error(`Unknown stage tool: ${name}`);
64
+ }
65
+ }
66
+ function mapPrivacyLevelToString(level) {
67
+ switch (level) {
68
+ case StageInstancePrivacyLevel.GuildOnly:
69
+ return 'guild_only';
70
+ default:
71
+ return 'unknown';
72
+ }
73
+ }
74
+ async function listStageInstances() {
75
+ const guild = await getGuild();
76
+ const fetched = await guild.stageInstances.fetch({});
77
+ // Handle both Collection and array-like returns
78
+ const instances = fetched instanceof Map ? Array.from(fetched.values()) : Array.isArray(fetched) ? fetched : [fetched].filter(Boolean);
79
+ const result = instances.map(instance => {
80
+ const channel = guild.channels.cache.get(instance.channelId);
81
+ return {
82
+ id: instance.id,
83
+ topic: instance.topic,
84
+ channelId: instance.channelId,
85
+ channelName: channel?.name ?? null,
86
+ privacyLevel: mapPrivacyLevelToString(instance.privacyLevel),
87
+ discoverableDisabled: instance.discoverableDisabled,
88
+ };
89
+ });
90
+ return JSON.stringify(result, null, 2);
91
+ }
92
+ async function startStage(args) {
93
+ const guild = await getGuild();
94
+ const channelQuery = args['channel'];
95
+ const topic = args['topic'];
96
+ const sendNotification = args['sendNotification'] ?? false;
97
+ const channel = await smartFindChannel(channelQuery);
98
+ if (channel.type !== ChannelType.GuildStageVoice) {
99
+ throw new Error(`Channel "${channel.name}" is not a stage channel. It must be a stage voice channel.`);
100
+ }
101
+ try {
102
+ const stageInstance = await guild.stageInstances.create(channel.id, {
103
+ topic,
104
+ privacyLevel: StageInstancePrivacyLevel.GuildOnly,
105
+ sendStartNotification: sendNotification,
106
+ });
107
+ const resolvedChannel = guild.channels.cache.get(stageInstance.channelId);
108
+ return JSON.stringify({
109
+ success: true,
110
+ message: `Stage instance started with topic "${stageInstance.topic}"`,
111
+ stageInstance: {
112
+ id: stageInstance.id,
113
+ topic: stageInstance.topic,
114
+ channelId: stageInstance.channelId,
115
+ channelName: resolvedChannel?.name ?? null,
116
+ privacyLevel: mapPrivacyLevelToString(stageInstance.privacyLevel),
117
+ discoverableDisabled: stageInstance.discoverableDisabled,
118
+ },
119
+ }, null, 2);
120
+ }
121
+ catch (error) {
122
+ throw new Error(`Failed to start stage instance: ${error.message}`);
123
+ }
124
+ }
125
+ async function endStage(args) {
126
+ const guild = await getGuild();
127
+ const channelQuery = args['channel'];
128
+ const channel = await smartFindChannel(channelQuery);
129
+ if (channel.type !== ChannelType.GuildStageVoice) {
130
+ throw new Error(`Channel "${channel.name}" is not a stage channel.`);
131
+ }
132
+ const stageChannel = channel;
133
+ let stageInstance = stageChannel.stageInstance;
134
+ if (!stageInstance) {
135
+ // Try fetching from guild stage instances
136
+ try {
137
+ stageInstance = await guild.stageInstances.fetch(channel.id);
138
+ }
139
+ catch {
140
+ throw new Error(`No active stage instance found on channel "${channel.name}".`);
141
+ }
142
+ }
143
+ if (!stageInstance) {
144
+ throw new Error(`No active stage instance found on channel "${channel.name}".`);
145
+ }
146
+ const topic = stageInstance.topic;
147
+ await guild.stageInstances.delete(channel.id);
148
+ return JSON.stringify({
149
+ success: true,
150
+ message: `Stage instance with topic "${topic}" ended successfully on channel "${channel.name}"`,
151
+ }, null, 2);
152
+ }
153
+ //# sourceMappingURL=stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../src/tools/stage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ /**
3
+ * Thread management tools
4
+ */
5
+ export declare const threadTools: Tool[];
6
+ export declare function executeThreadTool(name: string, args: Record<string, unknown>): Promise<string>;
@@ -0,0 +1,331 @@
1
+ import { getGuild } from '../discord-client.js';
2
+ import { smartFindTextChannel } from './utils.js';
3
+ import { ChannelType } from 'discord.js';
4
+ /**
5
+ * Thread management tools
6
+ */
7
+ export const threadTools = [
8
+ {
9
+ name: 'list_threads',
10
+ description: 'List active threads in the Discord server. Optionally filter to a specific channel (fuzzy-matched).',
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: {
14
+ channel: {
15
+ type: 'string',
16
+ description: 'Channel name or ID to filter threads to (fuzzy matched, optional)',
17
+ },
18
+ },
19
+ required: [],
20
+ },
21
+ },
22
+ {
23
+ name: 'create_thread',
24
+ description: 'Create a new thread in a channel. Channel name is fuzzy-matched. Can create a thread from an existing message or a standalone thread.',
25
+ inputSchema: {
26
+ type: 'object',
27
+ properties: {
28
+ channel: {
29
+ type: 'string',
30
+ description: 'The channel name or ID to create the thread in (fuzzy matched)',
31
+ },
32
+ name: {
33
+ type: 'string',
34
+ description: 'The name for the new thread',
35
+ },
36
+ messageId: {
37
+ type: 'string',
38
+ description: 'The ID of a message to start the thread from (optional — creates a standalone thread if omitted)',
39
+ },
40
+ autoArchiveDuration: {
41
+ type: 'number',
42
+ description: 'Auto-archive duration in minutes: 60, 1440 (1 day), 4320 (3 days), or 10080 (7 days)',
43
+ },
44
+ reason: {
45
+ type: 'string',
46
+ description: 'The reason for creating this thread (shown in audit log)',
47
+ },
48
+ },
49
+ required: ['channel', 'name'],
50
+ },
51
+ },
52
+ {
53
+ name: 'archive_thread',
54
+ description: 'Archive a thread by name or ID. Optionally specify the parent channel to help find the thread.',
55
+ inputSchema: {
56
+ type: 'object',
57
+ properties: {
58
+ thread: {
59
+ type: 'string',
60
+ description: 'The thread name or ID to archive',
61
+ },
62
+ channel: {
63
+ type: 'string',
64
+ description: 'The parent channel name or ID to help find the thread (fuzzy matched, optional)',
65
+ },
66
+ },
67
+ required: ['thread'],
68
+ },
69
+ },
70
+ {
71
+ name: 'unarchive_thread',
72
+ description: 'Unarchive a thread by name or ID. Optionally specify the parent channel to help find the thread.',
73
+ inputSchema: {
74
+ type: 'object',
75
+ properties: {
76
+ thread: {
77
+ type: 'string',
78
+ description: 'The thread name or ID to unarchive',
79
+ },
80
+ channel: {
81
+ type: 'string',
82
+ description: 'The parent channel name or ID to help find the thread (fuzzy matched, optional)',
83
+ },
84
+ },
85
+ required: ['thread'],
86
+ },
87
+ },
88
+ {
89
+ name: 'delete_thread',
90
+ description: 'Delete a thread by name or ID.',
91
+ inputSchema: {
92
+ type: 'object',
93
+ properties: {
94
+ thread: {
95
+ type: 'string',
96
+ description: 'The thread name or ID to delete',
97
+ },
98
+ reason: {
99
+ type: 'string',
100
+ description: 'The reason for deleting this thread (shown in audit log)',
101
+ },
102
+ },
103
+ required: ['thread'],
104
+ },
105
+ },
106
+ {
107
+ name: 'lock_thread',
108
+ description: 'Lock a thread to prevent new messages.',
109
+ inputSchema: {
110
+ type: 'object',
111
+ properties: {
112
+ thread: {
113
+ type: 'string',
114
+ description: 'The thread name or ID to lock',
115
+ },
116
+ reason: {
117
+ type: 'string',
118
+ description: 'The reason for locking this thread (shown in audit log)',
119
+ },
120
+ },
121
+ required: ['thread'],
122
+ },
123
+ },
124
+ {
125
+ name: 'unlock_thread',
126
+ description: 'Unlock a thread to allow new messages.',
127
+ inputSchema: {
128
+ type: 'object',
129
+ properties: {
130
+ thread: {
131
+ type: 'string',
132
+ description: 'The thread name or ID to unlock',
133
+ },
134
+ reason: {
135
+ type: 'string',
136
+ description: 'The reason for unlocking this thread (shown in audit log)',
137
+ },
138
+ },
139
+ required: ['thread'],
140
+ },
141
+ },
142
+ ];
143
+ export async function executeThreadTool(name, args) {
144
+ switch (name) {
145
+ case 'list_threads':
146
+ return await listThreads(args);
147
+ case 'create_thread':
148
+ return await createThread(args);
149
+ case 'archive_thread':
150
+ return await archiveThread(args);
151
+ case 'unarchive_thread':
152
+ return await unarchiveThread(args);
153
+ case 'delete_thread':
154
+ return await deleteThread(args);
155
+ case 'lock_thread':
156
+ return await lockThread(args);
157
+ case 'unlock_thread':
158
+ return await unlockThread(args);
159
+ default:
160
+ throw new Error(`Unknown thread tool: ${name}`);
161
+ }
162
+ }
163
+ /**
164
+ * Find a thread by name or ID from the guild's active threads
165
+ */
166
+ async function findThread(identifier) {
167
+ const guild = await getGuild();
168
+ // Try exact ID match from guild channels cache
169
+ const cachedChannel = guild.channels.cache.get(identifier);
170
+ if (cachedChannel && cachedChannel.isThread()) {
171
+ return cachedChannel;
172
+ }
173
+ // Fetch active threads and try matching
174
+ const activeThreads = await guild.channels.fetchActiveThreads();
175
+ // Try exact ID match from active threads
176
+ const idMatch = activeThreads.threads.get(identifier);
177
+ if (idMatch) {
178
+ return idMatch;
179
+ }
180
+ // Try name match (case-insensitive)
181
+ const identifierLower = identifier.toLowerCase();
182
+ const nameMatch = activeThreads.threads.find(t => t.name.toLowerCase() === identifierLower);
183
+ if (nameMatch) {
184
+ return nameMatch;
185
+ }
186
+ // Try partial name match (case-insensitive)
187
+ const partialMatch = activeThreads.threads.find(t => t.name.toLowerCase().includes(identifierLower) || identifierLower.includes(t.name.toLowerCase()));
188
+ if (partialMatch) {
189
+ return partialMatch;
190
+ }
191
+ // Not found — provide helpful error
192
+ const threadNames = activeThreads.threads.map(t => t.name);
193
+ let errorMsg = `Thread "${identifier}" not found.`;
194
+ if (threadNames.length > 0) {
195
+ errorMsg += ` Active threads: ${threadNames.join(', ')}`;
196
+ }
197
+ else {
198
+ errorMsg += ' No active threads found in this server.';
199
+ }
200
+ throw new Error(errorMsg);
201
+ }
202
+ function formatThread(thread) {
203
+ return {
204
+ name: thread.name,
205
+ id: thread.id,
206
+ parentChannel: thread.parent
207
+ ? { name: thread.parent.name, id: thread.parent.id }
208
+ : null,
209
+ messageCount: thread.messageCount ?? null,
210
+ memberCount: thread.memberCount ?? null,
211
+ archived: thread.archived ?? false,
212
+ locked: thread.locked ?? false,
213
+ createdAt: thread.createdAt?.toISOString() ?? null,
214
+ archiveTimestamp: thread.archiveTimestamp
215
+ ? new Date(thread.archiveTimestamp).toISOString()
216
+ : null,
217
+ };
218
+ }
219
+ async function listThreads(args) {
220
+ const guild = await getGuild();
221
+ const channelIdentifier = args['channel'];
222
+ if (channelIdentifier) {
223
+ // Filter to a specific channel
224
+ const channel = await smartFindTextChannel(channelIdentifier);
225
+ const activeThreads = await guild.channels.fetchActiveThreads();
226
+ const channelThreads = activeThreads.threads.filter(t => t.parentId === channel.id);
227
+ const threads = channelThreads.map(t => formatThread(t));
228
+ return JSON.stringify({
229
+ channel: { name: channel.name, id: channel.id },
230
+ threadCount: threads.length,
231
+ threads,
232
+ }, null, 2);
233
+ }
234
+ // List all active threads
235
+ const activeThreads = await guild.channels.fetchActiveThreads();
236
+ const threads = activeThreads.threads.map(t => formatThread(t));
237
+ return JSON.stringify({
238
+ threadCount: threads.length,
239
+ threads,
240
+ }, null, 2);
241
+ }
242
+ async function createThread(args) {
243
+ const channelIdentifier = args['channel'];
244
+ const name = args['name'];
245
+ const messageId = args['messageId'];
246
+ const autoArchiveDuration = args['autoArchiveDuration'];
247
+ const reason = args['reason'];
248
+ const channel = await smartFindTextChannel(channelIdentifier);
249
+ // Ensure the channel supports threads (must be a text-based channel with threads)
250
+ if (!('threads' in channel)) {
251
+ throw new Error(`Channel "#${channel.name}" does not support threads.`);
252
+ }
253
+ let thread;
254
+ if (messageId) {
255
+ // Create thread from a message
256
+ thread = await channel.threads.create({
257
+ startMessage: messageId,
258
+ name,
259
+ autoArchiveDuration: autoArchiveDuration,
260
+ reason: reason ?? 'Created via MCP',
261
+ });
262
+ }
263
+ else {
264
+ // Create standalone thread
265
+ thread = await channel.threads.create({
266
+ name,
267
+ autoArchiveDuration: autoArchiveDuration,
268
+ type: ChannelType.PublicThread,
269
+ reason: reason ?? 'Created via MCP',
270
+ });
271
+ }
272
+ return JSON.stringify({
273
+ success: true,
274
+ message: `Thread "${thread.name}" created successfully in #${channel.name}`,
275
+ thread: formatThread(thread),
276
+ }, null, 2);
277
+ }
278
+ async function archiveThread(args) {
279
+ const threadIdentifier = args['thread'];
280
+ const thread = await findThread(threadIdentifier);
281
+ await thread.setArchived(true);
282
+ return JSON.stringify({
283
+ success: true,
284
+ message: `Thread "${thread.name}" archived successfully`,
285
+ thread: formatThread(thread),
286
+ }, null, 2);
287
+ }
288
+ async function unarchiveThread(args) {
289
+ const threadIdentifier = args['thread'];
290
+ const thread = await findThread(threadIdentifier);
291
+ await thread.setArchived(false);
292
+ return JSON.stringify({
293
+ success: true,
294
+ message: `Thread "${thread.name}" unarchived successfully`,
295
+ thread: formatThread(thread),
296
+ }, null, 2);
297
+ }
298
+ async function deleteThread(args) {
299
+ const threadIdentifier = args['thread'];
300
+ const reason = args['reason'];
301
+ const thread = await findThread(threadIdentifier);
302
+ const threadName = thread.name;
303
+ await thread.delete(reason);
304
+ return JSON.stringify({
305
+ success: true,
306
+ message: `Thread "${threadName}" deleted successfully`,
307
+ }, null, 2);
308
+ }
309
+ async function lockThread(args) {
310
+ const threadIdentifier = args['thread'];
311
+ const reason = args['reason'];
312
+ const thread = await findThread(threadIdentifier);
313
+ await thread.setLocked(true, reason);
314
+ return JSON.stringify({
315
+ success: true,
316
+ message: `Thread "${thread.name}" locked successfully`,
317
+ thread: formatThread(thread),
318
+ }, null, 2);
319
+ }
320
+ async function unlockThread(args) {
321
+ const threadIdentifier = args['thread'];
322
+ const reason = args['reason'];
323
+ const thread = await findThread(threadIdentifier);
324
+ await thread.setLocked(false, reason);
325
+ return JSON.stringify({
326
+ success: true,
327
+ message: `Thread "${thread.name}" unlocked successfully`,
328
+ thread: formatThread(thread),
329
+ }, null, 2);
330
+ }
331
+ //# sourceMappingURL=threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/tools/threads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { CategoryChannel, GuildChannel, Role, GuildMember, GuildTextBasedChannel } from 'discord.js';
2
+ /**
3
+ * Smart find a channel that can receive messages - includes text channels, announcement channels, and voice channel text chats
4
+ */
5
+ export declare function smartFindTextChannel(identifier: string): Promise<GuildTextBasedChannel>;
6
+ /**
7
+ * Smart find any channel (text, voice, category) - uses cached data
8
+ */
9
+ export declare function smartFindChannel(identifier: string): Promise<GuildChannel>;
10
+ /**
11
+ * Smart find category channel - uses cached data
12
+ */
13
+ export declare function smartFindCategory(identifier: string): Promise<CategoryChannel>;
14
+ /**
15
+ * Smart find role - uses cached data and fuzzy matching
16
+ */
17
+ export declare function smartFindRole(identifier: string): Promise<Role>;
18
+ /**
19
+ * Smart find member - uses cached data and fuzzy matching
20
+ */
21
+ export declare function smartFindMember(identifier: string): Promise<GuildMember>;