Chat & Event Bridge
Relay Minecraft chat and events to Discord, run the live console, and moderate from Discord.
Chat bridge
AdminThe chat bridge relays messages between Minecraft and a Discord channel, so your in-game and Discord conversations stay in one place. Configure it on the Bridge page for the selected server.
A chat line or a death is relayed only after every other plugin or mod has decided on it: a line a mute or filter plugin cancels never reaches Discord, and one a filter changes arrives changed. On Paper, a line no other player in game sees (a shadow mute, or a private channel with no one else in it) stays off Discord too. Chat plugins that add rank prefixes (LuckPerms and the like) don't cause a second copy. A /me a player types is posted as an action line; one a command block, a datapack function or /execute as runs is not.
Minecraft lines arrive through a Madsi Chat webhook Madsi makes in the chat channel. Move the bridge to another channel or clear it (on the Bridge page or with a DiscordSRV import) and Madsi deletes the old webhook, unless another of your servers still posts through it. Deleting it needs the Manage Webhooks permission; without it the old webhook stays and you can remove it in the channel's settings. If Madsi can't make the webhook (it lacks Manage Webhooks there, or the channel already has Discord's limit of 15 webhooks), Minecraft chat can't reach Discord: the Bridge page says why. Madsi tries again with the next Minecraft chat line, at most every 5 minutes, and the warning clears once it works.
Whisper delivery sets where a whisper to someone on Discord shows up, for every Minecraft server in your Discord server: in the chat channel, as a notice that pings them with a Read button only they can use, or by DM. With DMs, also pick what happens when someone's DMs are closed: post the channel notice instead, or tell the sender it wasn't sent. Madsi never stores a whisper it delivers by DM. Whisper tracking mirrors whispers to a staff channel, whichever way they are delivered.
Vanished players and hidden deaths
AdminMadsi spots a vanished player through SuperVanish, PremiumVanish, EssentialsX or VanishNoPacket on Paper, through DrexHD's Vanish mod on Fabric, and through Vanishmod on NeoForge. The Vanished players section of the server's Settings page has one switch for each thing they are left out of:
- Discord relays: no join, leave, chat, death, advancement or milestone post. On by default.
- Names in online lists: not named in
/online,/server, the status card or whisper lookups, and shown as offline in/stats. On by default. - Counts shown in Discord: left out of the player counts in counter channels and the bot's status, and in
/online,/serverand the status card when Names in online lists hides them too (a name that shows is always counted). On by default. - Sessions and activity: no play session, and left out of the activity chart and
/activity. - Stat roles: earns no stat roles from this server, and loses the ones it gave.
- Leaderboards: left out of
/leaderboardand leaderboard stat roles.
Stat roles and leaderboards go by whether the player was vanished the last time Madsi saw them, so staff who always join vanished stay off them while offline too.
When another Paper plugin clears a death message, Madsi still posts one it builds itself, such as "Steve died" or "Steve was slain by Alex". Switch Post deaths other plugins hide off to skip those deaths entirely.
Hide bots (on by default, on Fabric, NeoForge and Paper) leaves Carpet bots, fake players other mods run and Citizens NPCs out of join and leave posts, online lists and counts, the bot's status, sessions, the activity chart, statistics, stat roles and leaderboards. Switch it off and they join, leave and count like players. Their deaths and advancements are never posted either way.
Content filter
AdminEverything that crosses the bridge can be filtered on its way through. Blocked words is a list of words or phrases (one per line, a trailing * also catches longer forms) that either blocks the message or masks the match with ***. Allowed words are exceptions to that list, block ass, allow assassin, and only the first one fires. The Links rule decides what happens to a message carrying a link or attachment URL: allow it, remove the link, replace it with text of your choosing, or block the message. Server addresses and attachment URLs count as links, and allowed links lets your own domains and their subdomains through whatever the rule says. Each direction can be switched on or off independently, and whispers sent across the bridge follow the same rules. Turning the chat bridge off keeps the filter: whispers stay filtered, and the rules are still there when you pick a channel again.
Hold Discord messages waits up to five seconds before relaying a Discord message in-game. If a moderator or Discord AutoMod deletes the message inside that window, the relay is cancelled and players never see it; an edit inside the window relays the edited text instead. A blocked message gets a 🚫 reaction.
Blocked patterns covers what a word list can't say, one regular expression per line, matched exactly like a blocked word and honouring the same allow list. discord\.gg/\w+ catches invites to other servers, for instance. Patterns run on RE2 rather than the usual JavaScript engine, so no pattern can slow the bot down however it is written; the trade is that lookaheads ((?=…)) and backreferences (\1) aren't available, and anything unusable is rejected when you save it rather than failing silently later.
If a regular expression isn't how you think, Describe one instead takes a sentence ("invites to other Discord servers") and proposes a pattern for it, along with a handful of example messages showing what it would block and what it would let through. Anything that doesn't behave as described is flagged. The suggestion is only a suggestion: it goes into the box for you to accept, and nothing takes effect until you save the list. Each Discord server can ask twice a day, shared across its Minecraft servers.
The filter only touches the bridged copy of a message. The original stays in Discord as posted. Use Discord AutoMod for Discord itself, and this filter for what reaches the game.
Event feeds
AdminMadsi can post server events to Discord: joins, leaves, deaths, advancements, restart warnings, and server status changes. Each event type has its own channel routing, so you can send (for example) deaths to one channel and joins to another, and toggle any of them off. A player who earns many advancements at once (a datapack, or /advancement grant) gets the first posted on its own and the rest of that burst as one message a few seconds later.
Route noisy feeds (like chat or deaths) to their own channels to keep your main channel readable.
Live console
AdminThe Console page streams your server log live and lets authorised team members run commands remotely: no RCON port to expose. Running commands needs the Console Run commands team permission; the raw log needs Read console; the console channel, allow and deny lists, presets and alerts need Configure console; seeing the team command library needs Run commands or a Team commands permission; and adding, editing or deleting team commands needs Team commands: Own (your own) or All (everyone's). Picking a new console channel also needs Read console, since the channel receives the log, and it must be a channel you can see in Discord.
Type a command in the box under the log and press Enter (no leading slash needed); the up and down arrows bring back what you ran this visit. It goes through the same checks as the Discord console channel: the Run commands permission, a paid plan, and the channel's allow and deny lists. The reply shows under the box and the server's own output in the log; every command is in the audit log.
Each member can run 30 commands a minute, counting the console channel, this box, saved commands and team commands together. A saved or team command written by a member without the Run commands permission waits as Awaiting approval until a member with it approves the line on the Console page; until then nobody can run it, and an edit by a member without Run commands sends it back for approval.
Every message in the Discord console channel runs as a command, so it can't be a chat bridge channel, on this server or any other. Each server needs its own console channel: one channel can't be the console of two servers. A parked server's console doesn't hold its channel, so when the server comes back and that channel is now another server's console or chat bridge, its console is turned off until you pick a new channel.
To refuse every remote command on a machine, set allowConsole: false in config/madsi.json and restart the server. The dashboard can't override it: the console channel, saved and team commands, scheduled commands and restarts all stop running there, while the log keeps streaming.
Moderation from Discord
AdminMembers with Discord's Manage Server can moderate the Minecraft server straight from Discord. Once the server owner turns on Moderators can use moderation commands under Ban sync on the Members page, so can a Madsi team role with the Bans permission:
| Command | Description |
|---|---|
/mc-ban | Ban a player from the Minecraft server. |
/mc-kick | Kick a player from the Minecraft server. |
/mc-unban | Lift a ban. |
These three are slash commands only by default: a text prefix such as w!mc-ban gets a pointer to the slash command instead. Turn the text form on per command with its Text prefix switch on the Commands page.
Ban sync keeps Discord and Minecraft bans in step, guild-wide. A Discord ban carries to the member's linked Minecraft account by default; a Minecraft ban stays put. A member who unlinked, or left and was unlinked, before the ban is followed to the Minecraft account they last linked, when the ban comes within 30 days and nobody else holds a link to that account. Turn on Minecraft ban → Discord ban (off by default) and a Minecraft ban whose reason contains the mirror keyword ([dc]) also bans the linked Discord account, unless that member holds Ban Members, Manage Server or Administrator, or outranks the linked Discord account of the player who issued the ban. When that refuses the Discord ban, the Minecraft ban stays on the server it was made on too. A ban or pardon a player runs in game spreads, to Discord or the other servers, only from a server that verifies who joins (online-mode=true, or Velocity modern forwarding or a login plugin the owner confirmed in that server's Settings: My Velocity proxy runs in online mode or This server authenticates players (login plugin)); on offline mode or BungeeCord anyone could join under a staff member's name, so it stays on that server. An in-game ban also spreads only when the player who issued it has linked a Discord account. The server console's bans and pardons are not held to this. A ban run from Madsi's console is held to the runner's own Discord rights (Ban Members and a higher role), as /mc-ban is; without Ban Members it stays on that server, as does one a scheduled task runs, or one that two people ran against the same player from Madsi's console within five minutes. A ban or pardon that a datapack function, /schedule or a Carpet script a member runs from Madsi's console makes within five minutes counts as that member's too, and so does one typed at the server's own console in that time; when a scheduled task runs one, every ban and pardon the server reports within five minutes stays on that server, one typed at the server's own console included. A ban or pardon with no player or console behind it (a command block, a datapack function or another mod, whoever /execute as runs it as) always stays on its own server. Put the Discord-only keyword (dc-only) in a Discord ban reason to keep that ban Discord-side, and optionally mirror Discord timeouts as temporary Minecraft bans. Discord tells a bot about bans only when it holds Ban Members or View Audit Log. Madsi's invite asks for View Audit Log; a server that added Madsi before it did, or removed it from Madsi's role, has to give Madsi's role one of them before relying on ban sync. View Audit Log also lets Madsi catch up on Discord bans and timeouts made while it restarts (a timeout set while the mirror was off, or before the member linked, stays Discord-only), and mirroring a Minecraft ban to Discord needs Ban Members. The Members page warns when one is missing. A player a Madsi ban disconnects sees a ban screen with the reason, which you can edit on the Messages page (Moderation: ban screen in Minecraft). Configure it on the Members page. The resulting actions are logged by the mod log above.
Madsi only lifts bans it placed itself: /mc-unban, a Discord unban or a lapsed timeout never touches a ban the server's own staff made in-game or at the console. A Discord unban lifts the Minecraft bans its Discord ban placed even after Discord ban → Minecraft ban is turned off, and only those: a later /mc-ban, or a mirror-keyword ban carried from one server to the others, stays until it is lifted the way it was made. A ban or unban for a server that is offline or parked waits, however long it takes, and lands when it is back; a timeout ban that ran out in the meantime is dropped. A server added to the guild picks up the guild's standing Madsi bans when it first connects (a timeout ban only while it still runs), even a ban made while the guild had no server, or one held only by servers since removed: Madsi keeps each standing ban for the Discord server, not for one Minecraft server. When staff pardon a player in-game, the guild's other servers lift the ban too when it was one Madsi placed, or when it was that server's own mirror-keyword ban that Madsi carried to the others; pardoning any other ban stays on that server. A pardon run from Madsi's console spreads that way only when the runner holds Ban Members in Discord, and one a scheduled task runs never does.
In-game messaging
Everyone| Command | Description |
|---|---|
/whisper <message> [user | mc]: to a Discord member or a Minecraft player (prefix: whisper <name> <message>) | Send a private in-game message (also /msg, /w, /tell). With a prefix, the typed message is deleted and the result comes by DM. |
/reply <message> | Reply to your last whisper (also /r). Five whispers a minute to the same person (five a minute in all from in game); anyone can turn whispers off on their Preferences page, or in game with /madsi whispers off. |