@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
JavaScript
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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