@chinchillaenterprises/mcp-discord
Version:
Modular Discord MCP server with 45+ tools for comprehensive server management, featuring clean architecture and discord_ prefixed tools
84 lines • 6.28 kB
JavaScript
export const toolDefinition = {
name: "discord_update_account",
description: "Update account credentials (e.g. for token rotation)",
inputSchema: {
type: "object",
properties: {
accountId: {
type: "string",
description: "Account ID to update",
},
name: {
type: "string",
description: "New account name",
},
token: {
type: "string",
description: "New Discord token",
},
guildId: {
type: "string",
description: "New guild ID",
},
},
required: ["accountId"],
}
};
export const handler = async (args, services) => {
const { accountId, name, token, guildId } = args;
const accountState = services.getAccountState();
const credentialManager = services.getCredentialManager();
const account = accountState.accounts.get(accountId);
if (!account) {
throw new Error(`Account '${accountId}' not found.`);
}
// Update account properties
if (name !== undefined)
account.name = name;
if (guildId !== undefined)
account.guildId = guildId;
if (token !== undefined) {
if (!validateTokenFormat(token)) {
throw new Error("Invalid Discord token format.");
}
account.token = token.startsWith('Bot ') ? token : `Bot ${token}`;
// Reinitialize client with new token
const oldClient = accountState.clients.get(accountId);
if (oldClient) {
oldClient.destroy();
}
try {
const newClient = await services.initializeClient(account);
accountState.clients.set(accountId, newClient);
}
catch (error) {
throw new Error(`Failed to verify new token: ${error.message}`);
}
}
// Save updated account
try {
await credentialManager.updateAccount(account);
}
catch (error) {
throw new Error(`Failed to save account updates: ${error.message}`);
}
return {
content: [
{
type: "text",
text: `Account '${account.name}' (${accountId}) has been updated successfully!
${name !== undefined ? `\n• Name: ${name}` : ''}
${token !== undefined ? '\n• Token: Updated ✓' : ''}
${guildId !== undefined ? `\n• Guild ID: ${guildId}` : ''}`,
},
],
};
};
function validateTokenFormat(token) {
// Basic validation - Discord tokens are base64 encoded
const cleanToken = token.replace('Bot ', '');
// Check if it looks like a valid base64 string with dots
return /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(cleanToken);
}
export { UpdateAccountArgsSchema as schema } from "../../schemas/account.js";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWFjY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMvYWNjb3VudC91cGRhdGUtYWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQVM7SUFDbEMsSUFBSSxFQUFFLHdCQUF3QjtJQUM5QixXQUFXLEVBQUUsc0RBQXNEO0lBQ25FLFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsU0FBUyxFQUFFO2dCQUNULElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxzQkFBc0I7YUFDcEM7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLGtCQUFrQjthQUNoQztZQUNELEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsbUJBQW1CO2FBQ2pDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxjQUFjO2FBQzVCO1NBQ0Y7UUFDRCxRQUFRLEVBQUUsQ0FBQyxXQUFXLENBQUM7S0FDeEI7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxJQUF1QixFQUFFLFFBQTBCLEVBQUUsRUFBRTtJQUNuRixNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ2pELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNoRCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBRTFELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxPQUFPLEVBQUUs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