Skip to main content
Glama
webhooks.ts4.68 kB
import { handleDiscordError } from '../error-handler.js'; import { CreateWebhookSchema, DeleteWebhookSchema, EditWebhookSchema, SendWebhookMessageSchema, } from '../schemas.js'; import type { ToolContext, ToolResponse } from './types.js'; // Create webhook handler export async function createWebhookHandler( args: unknown, context: ToolContext ): Promise<ToolResponse> { const { channelId, name, avatar, reason } = CreateWebhookSchema.parse(args); try { if (!context.client.isReady()) { return { content: [{ type: 'text', text: 'Discord client not logged in.' }], isError: true, }; } const channel = await context.client.channels.fetch(channelId); if (!channel?.isTextBased()) { return { content: [ { type: 'text', text: `Cannot find text channel with ID: ${channelId}`, }, ], isError: true, }; } // Check if the channel supports webhooks if (!('createWebhook' in channel)) { return { content: [ { type: 'text', text: `Channel type does not support webhooks: ${channelId}`, }, ], isError: true, }; } // Create the webhook const webhook = await channel.createWebhook({ name, avatar, reason, }); return { content: [ { type: 'text', text: `Successfully created webhook with ID: ${webhook.id} and token: ${webhook.token}`, }, ], }; } catch (error) { return handleDiscordError(error); } } // Send webhook message handler export async function sendWebhookMessageHandler( args: unknown, context: ToolContext ): Promise<ToolResponse> { const { webhookId, webhookToken, content, username, avatarURL, threadId } = SendWebhookMessageSchema.parse(args); try { if (!context.client.isReady()) { return { content: [{ type: 'text', text: 'Discord client not logged in.' }], isError: true, }; } const webhook = await context.client.fetchWebhook(webhookId, webhookToken); if (!webhook) { return { content: [ { type: 'text', text: `Cannot find webhook with ID: ${webhookId}` }, ], isError: true, }; } // Send the message await webhook.send({ content, username, avatarURL, threadId, }); return { content: [ { type: 'text', text: `Successfully sent webhook message to webhook ID: ${webhookId}`, }, ], }; } catch (error) { return handleDiscordError(error); } } // Edit webhook handler export async function editWebhookHandler( args: unknown, context: ToolContext ): Promise<ToolResponse> { const { webhookId, webhookToken, name, avatar, channelId, reason } = EditWebhookSchema.parse(args); try { if (!context.client.isReady()) { return { content: [{ type: 'text', text: 'Discord client not logged in.' }], isError: true, }; } const webhook = await context.client.fetchWebhook(webhookId, webhookToken); if (!webhook) { return { content: [ { type: 'text', text: `Cannot find webhook with ID: ${webhookId}` }, ], isError: true, }; } // Edit the webhook await webhook.edit({ name, avatar, channel: channelId, reason, }); return { content: [ { type: 'text', text: `Successfully edited webhook with ID: ${webhook.id}`, }, ], }; } catch (error) { return handleDiscordError(error); } } // Delete webhook handler export async function deleteWebhookHandler( args: unknown, context: ToolContext ): Promise<ToolResponse> { const { webhookId, webhookToken, reason } = DeleteWebhookSchema.parse(args); try { if (!context.client.isReady()) { return { content: [{ type: 'text', text: 'Discord client not logged in.' }], isError: true, }; } const webhook = await context.client.fetchWebhook(webhookId, webhookToken); if (!webhook) { return { content: [ { type: 'text', text: `Cannot find webhook with ID: ${webhookId}` }, ], isError: true, }; } // Delete the webhook await webhook.delete(reason || 'Webhook deleted via API'); return { content: [ { type: 'text', text: `Successfully deleted webhook with ID: ${webhook.id}`, }, ], }; } catch (error) { return handleDiscordError(error); } }

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/IQAIcom/mcp-discord'

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