Skip to main content
Glama

pin_message

Pin important messages in Discord channels to keep them visible and accessible for server members.

Instructions

Pin a message in a channel

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
guildIdYesThe ID of the server (guild)
channelIdYesThe ID of the channel
messageIdYesThe ID of the message to pin
reasonNoReason for pinning

Implementation Reference

  • Handler function that fetches the Discord guild, channel, and message, validates the channel type, pins the message using the Discord.js message.pin() method with optional reason, handles errors via withErrorHandling, and returns formatted success or error response.
    async ({ guildId, channelId, messageId, reason }) => { const result = await withErrorHandling(async () => { const client = await getDiscordClient(); const guild = await client.guilds.fetch(guildId); const channel = await guild.channels.fetch(channelId); if (!isMessageableChannel(channel)) { throw new Error('Channel does not support messages'); } const message = await channel.messages.fetch(messageId); await message.pin(reason); return { messageId, message: 'Message pinned successfully' }; }); if (!result.success) { return { content: [{ type: 'text', text: result.error }], isError: true }; } return { content: [{ type: 'text', text: JSON.stringify(result.data, null, 2) }] }; }
  • Zod schema for input parameters of the pin_message tool: required guildId, channelId, messageId; optional reason.
    { guildId: z.string().describe('The ID of the server (guild)'), channelId: z.string().describe('The ID of the channel'), messageId: z.string().describe('The ID of the message to pin'), reason: z.string().optional().describe('Reason for pinning'), },
  • Registration of the pin_message tool via server.tool() call inside registerMessageTools function, specifying name, description, input schema, and handler.
    server.tool( 'pin_message', 'Pin a message in a channel', { guildId: z.string().describe('The ID of the server (guild)'), channelId: z.string().describe('The ID of the channel'), messageId: z.string().describe('The ID of the message to pin'), reason: z.string().optional().describe('Reason for pinning'), }, async ({ guildId, channelId, messageId, reason }) => { const result = await withErrorHandling(async () => { const client = await getDiscordClient(); const guild = await client.guilds.fetch(guildId); const channel = await guild.channels.fetch(channelId); if (!isMessageableChannel(channel)) { throw new Error('Channel does not support messages'); } const message = await channel.messages.fetch(messageId); await message.pin(reason); return { messageId, message: 'Message pinned successfully' }; }); if (!result.success) { return { content: [{ type: 'text', text: result.error }], isError: true }; } return { content: [{ type: 'text', text: JSON.stringify(result.data, null, 2) }] }; } );
  • src/index.ts:58-58 (registration)
    Invocation of registerMessageTools(server) in createMcpServer(), which registers the pin_message tool as part of message tools.
    registerMessageTools(server);
  • Helper type guard function used in pin_message handler to validate if the fetched channel supports sending messages (TextChannel, NewsChannel, ThreadChannel).
    function isMessageableChannel(channel: unknown): channel is MessageableChannel { if (!channel || typeof channel !== 'object') return false; const ch = channel as { type?: number }; return ch.type === ChannelType.GuildText || ch.type === ChannelType.GuildAnnouncement || ch.type === ChannelType.PublicThread || ch.type === ChannelType.PrivateThread || ch.type === ChannelType.AnnouncementThread; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/scarecr0w12/discord-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server