UNPKG

@chinchillaenterprises/mcp-discord

Version:

Modular Discord MCP server with 45+ tools for comprehensive server management, featuring clean architecture and discord_ prefixed tools

72 lines 6.57 kB
import { ChannelType } from "discord.js"; export const toolDefinition = { name: "discord_get_channel_history", description: "Get recent messages from a Discord channel", inputSchema: { type: "object", properties: { channel: { type: "string", description: "Channel ID or name to fetch history from", }, limit: { type: "number", description: "Number of messages to return (1-100, default: 50)", minimum: 1, maximum: 100 }, before: { type: "string", description: "Get messages before this message ID", }, after: { type: "string", description: "Get messages after this message ID", } }, required: ["channel"], } }; export const handler = async (args, services) => { const { channel: channelInput, limit = 50, before, after } = args; const client = await services.getActiveClient(); try { // Resolve channel name to ID if needed const channelId = await services.resolveChannel(channelInput); const channel = await client.channels.fetch(channelId); if (!channel || channel.type !== ChannelType.GuildText) { throw new Error(`Channel ${channelId} not found or is not a text channel`); } const textChannel = channel; const fetchOptions = { limit }; if (before) fetchOptions.before = before; if (after) fetchOptions.after = after; const messagesCollection = await textChannel.messages.fetch(fetchOptions); const messageArray = Array.from(messagesCollection.values()); const messageList = messageArray.map(msg => ({ id: msg.id, author: `${msg.author.username}`, content: msg.content || '[No text content]', timestamp: msg.createdAt.toISOString(), hasEmbeds: msg.embeds.length > 0, reactions: msg.reactions.cache.map((r) => `${r.emoji.name} (${r.count})`).join(', ') || 'None', isReply: msg.reference ? `Reply to ${msg.reference.messageId}` : 'No' })); return { content: [ { type: "text", text: `Channel History for #${textChannel.name} (${messageArray.length} messages):\n\n${messageList.map((msg) => `**${msg.author}** - ${msg.timestamp}\nID: ${msg.id}\nContent: ${msg.content}\nReactions: ${msg.reactions}\n${msg.isReply}\n`).join('\n---\n')}` } ] }; } catch (error) { console.error(`[GetChannelHistory] Error fetching channel history:`, error); throw new Error(`Failed to get channel history: ${error.message}`); } }; export { GetChannelHistoryArgsSchema as schema } from "../../schemas/messaging.js"; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWNoYW5uZWwtaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29scy9tZXNzYWdpbmcvZ2V0LWNoYW5uZWwtaGlzdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsV0FBVyxFQUFlLE1BQU0sWUFBWSxDQUFDO0FBRXRELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBUztJQUNsQyxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLFdBQVcsRUFBRSw0Q0FBNEM7SUFDekQsV0FBVyxFQUFFO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDBDQUEwQzthQUN4RDtZQUNELEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsbURBQW1EO2dCQUNoRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPLEVBQUUsR0FBRzthQUNiO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxxQ0FBcUM7YUFDbkQ7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLG9DQUFvQzthQUNsRDtTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO0tBQ3RCO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsSUFBMkIsRUFBRSxRQUEwQixFQUFFLEVBQUU7SUFDdkYsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBRWxFLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBRWhELElBQUksQ0FBQztRQUNI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