Skip to main content
Glama
payload.ts2.59 kB
import { type DiscordPayloadParams, type SlackPayloadParams } from "./types.js"; import { safeJsonParse } from "./utils.js"; /** * Parse embed JSON safely, handling string, object, or array inputs */ export function parseEmbedJson(embedJson: unknown): unknown { if (typeof embedJson === "string") { const parsed = safeJsonParse(embedJson); if (parsed === null) { throw new Error("Invalid JSON in embed_json parameter"); } return parsed; } return embedJson; } /** * Build Discord webhook payload */ export function buildDiscordPayload(params: DiscordPayloadParams): object { const { message, embedJson, username, avatarUrl, tts = false } = params; // Validate message length (Discord limit: 2000 characters) if (message && message.length > 2000) { throw new Error(`Discord message exceeds 2000 character limit (${message.length})`); } const payload: any = {}; if (message) { payload.content = message; } if (username) { payload.username = username; } if (avatarUrl) { payload.avatar_url = avatarUrl; } if (tts) { payload.tts = true; } if (embedJson !== undefined) { const parsed = parseEmbedJson(embedJson); if (Array.isArray(parsed)) { // Array of embeds payload.embeds = parsed; } else if (parsed && typeof parsed === "object") { // Single embed object - wrap in array payload.embeds = [parsed]; } else { throw new Error("Discord embed_json must be an object or array of objects"); } } return payload; } /** * Build Slack webhook payload */ export function buildSlackPayload(params: SlackPayloadParams): object { const { message, embedJson, username, avatarUrl } = params; const payload: any = {}; if (message) { payload.text = message; } if (username) { payload.username = username; } if (avatarUrl) { payload.icon_url = avatarUrl; } if (embedJson !== undefined) { const parsed = parseEmbedJson(embedJson); if (Array.isArray(parsed)) { // Array format: treat as blocks payload.blocks = parsed; } else if (parsed && typeof parsed === "object") { const obj = parsed as Record<string, unknown>; if ("attachments" in obj) { // Object contains attachments - merge the object directly Object.assign(payload, obj); } else { // Regular object - merge keys into payload Object.assign(payload, obj); } } else { throw new Error("Slack embed_json must be an object or array"); } } return payload; }

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/thesammykins/notifyme_mcp'

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