Skip to content
Documentation
Documentation

Adapters Overview

MUS is notification-agnostic. An adapter tells MUS where to send feedback. You configure it once in createMusHandlers and every event (voice, thumbs, support requests, standalone) flows through it.

import { createMusHandlers } from '@datachef/mus/server'
import { slackAdapter } from '@datachef/mus/adapters/slack'
export const { POST, POSTStandalone, POSTSupportChannel } = createMusHandlers({
adapter: slackAdapter({ token: process.env.SLACK_BOT_TOKEN! }),
})
AdapterImportUse case
Slack@datachef/mus/adapters/slackFull Slack integration: threads, channels, file uploads
Discord@datachef/mus/adapters/discordDiscord channel via incoming webhook
Microsoft Teams@datachef/mus/adapters/teamsTeams channel via incoming webhook
Webhook@datachef/mus/adapters/webhookAny HTTP endpoint: Zapier, n8n, custom API
Custom(none)Implement MusAdapter for any destination

Pass an array to fan out to multiple destinations simultaneously. All adapters run in parallel, so a failure in one doesn’t block the others.

createMusHandlers({
adapter: [
slackAdapter({ token: process.env.SLACK_BOT_TOKEN! }),
discordAdapter({ webhookUrl: process.env.DISCORD_WEBHOOK_URL! }),
],
})

Conditionally include adapters:

createMusHandlers({
adapter: [
slackAdapter({ token: process.env.SLACK_BOT_TOKEN! }),
process.env.DISCORD_WEBHOOK_URL
? discordAdapter({ webhookUrl: process.env.DISCORD_WEBHOOK_URL })
: null,
].filter(Boolean),
})

Every adapter implements this interface. Only the methods you define are called; unimplemented methods are silently skipped.

interface MusAdapter {
onVoiceUpload?(event: VoiceEvent): Promise<void>
onSupportRequest?(event: SupportEvent): Promise<{ channelId?: string }>
onStandaloneFeedback?(event: StandaloneEvent): Promise<void>
}

See Event Types for the full event shapes.