@chinchillaenterprises/mcp-discord
Version:
Modular Discord MCP server with 45+ tools for comprehensive server management, featuring clean architecture and discord_ prefixed tools
87 lines (85 loc) • 7.18 kB
JavaScript
import { PermissionsBitField } from "discord.js";
export const toolDefinition = {
name: "discord_set_channel_permissions",
description: "Set channel permissions for a role or member",
inputSchema: {
type: "object",
properties: {
channelId: {
type: "string",
description: "Channel ID or name",
},
targetId: {
type: "string",
description: "Role ID or User ID to set permissions for",
},
type: {
type: "string",
enum: ["role", "member"],
description: "Whether target is a role or member",
},
allow: {
type: "array",
items: { type: "string" },
description: "Permissions to allow",
},
deny: {
type: "array",
items: { type: "string" },
description: "Permissions to deny",
},
reason: {
type: "string",
description: "Reason for permission change (optional)",
},
},
required: ["channelId", "targetId", "type"],
}
};
export const handler = async (args, services) => {
const { channelId, targetId, type, allow = [], deny = [], reason } = args;
const client = await services.getActiveClient();
const guild = await services.getGuild();
try {
const resolvedChannelId = await services.resolveChannel(channelId);
const channel = await client.channels.fetch(resolvedChannelId);
if (!channel || !guild.channels.cache.has(channel.id)) {
throw new Error(`Channel ${channelId} not found`);
}
const textOrVoiceChannel = channel;
// Create permission bitfields
const allowBits = allow.length > 0 ? new PermissionsBitField(allow) : new PermissionsBitField();
const denyBits = deny.length > 0 ? new PermissionsBitField(deny) : new PermissionsBitField();
// Create permission overwrite object
const permissionOverwrite = {};
// Map permissions to boolean values for the edit method
allow.forEach(perm => {
permissionOverwrite[perm] = true;
});
deny.forEach(perm => {
permissionOverwrite[perm] = false;
});
// Edit the permission overwrites
await textOrVoiceChannel.permissionOverwrites.edit(targetId, permissionOverwrite, { reason });
return {
content: [
{
type: "text",
text: `✅ Successfully updated channel permissions!
**Channel:** #${textOrVoiceChannel.name} (${textOrVoiceChannel.id})
**Target:** ${type} ${targetId}
**Allowed permissions:** ${allow.length > 0 ? allow.join(', ') : 'None'}
**Denied permissions:** ${deny.length > 0 ? deny.join(', ') : 'None'}
${reason ? `**Reason:** ${reason}` : ''}
Permissions have been applied to the channel.`,
},
],
};
}
catch (error) {
console.error(`[SetChannelPermissions] Error setting permissions:`, error);
throw new Error(`Failed to set channel permissions: ${error.message}`);
}
};
export { SetChannelPermissionsArgsSchema as schema } from "../../schemas/server.js";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LWNoYW5uZWwtcGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMvc2VydmVyL3NldC1jaGFubmVsLXBlcm1pc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBNkIsbUJBQW1CLEVBQWlCLE1BQU0sWUFBWSxDQUFDO0FBRTNGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBUztJQUNsQyxJQUFJLEVBQUUsaUNBQWlDO0lBQ3ZDLFdBQVcsRUFBRSw4Q0FBOEM7SUFDM0QsV0FBVyxFQUFFO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLG9CQUFvQjthQUNsQztZQUNELFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsMkNBQTJDO2FBQ3pEO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7Z0JBQ3hCLFdBQVcsRUFBRSxvQ0FBb0M7YUFDbEQ7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDekIsV0FBVyxFQUFFLHNCQUFzQjthQUNwQztZQUNELElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsT0FBTztnQkFDYixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUN6QixXQUFXLEVBQUUscUJBQXFCO2FBQ25DO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSx5Q0FBeUM7YUFDdkQ7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDO0tB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