Add discord_list_guilds tool to list bot's guild memberships

Co-authored-by: SootyOwl <7614538+SootyOwl@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2025-10-11 22:54:40 +00:00
parent 6310e9dadc
commit 9cdafc31c0
6 changed files with 63 additions and 6 deletions

View File

@ -129,4 +129,6 @@ export const DeleteWebhookSchema = z.object({
webhookId: z.string(), webhookId: z.string(),
webhookToken: z.string().optional(), webhookToken: z.string().optional(),
reason: z.string().optional() reason: z.string().optional()
}); });
export const ListGuildsSchema = z.object({});

View File

@ -29,7 +29,8 @@ import {
deleteWebhookHandler, deleteWebhookHandler,
createCategoryHandler, createCategoryHandler,
editCategoryHandler, editCategoryHandler,
deleteCategoryHandler deleteCategoryHandler,
listGuildsHandler
} from './tools/tools.js'; } from './tools/tools.js';
import { MCPTransport } from './transport.js'; import { MCPTransport } from './transport.js';
import { info, error } from './logger.js'; import { info, error } from './logger.js';
@ -178,6 +179,11 @@ export class DiscordMCPServer {
toolResponse = await deleteWebhookHandler(args, this.toolContext); toolResponse = await deleteWebhookHandler(args, this.toolContext);
return toolResponse; return toolResponse;
case "discord_list_guilds":
this.logClientState("before discord_list_guilds handler");
toolResponse = await listGuildsHandler(args, this.toolContext);
return toolResponse;
default: default:
throw new Error(`Unknown tool: ${name}`); throw new Error(`Unknown tool: ${name}`);
} }

View File

@ -292,5 +292,14 @@ export const toolList = [
}, },
required: ["webhookId"] required: ["webhookId"]
} }
},
{
name: "discord_list_guilds",
description: "Lists all Discord servers (guilds) the bot is a member of",
inputSchema: {
type: "object",
properties: {},
required: []
}
} }
]; ];

View File

@ -8,7 +8,8 @@ import {
GetServerInfoSchema, GetServerInfoSchema,
CreateCategorySchema, CreateCategorySchema,
EditCategorySchema, EditCategorySchema,
DeleteCategorySchema DeleteCategorySchema,
ListGuildsSchema
} from "../schemas.js"; } from "../schemas.js";
import { handleDiscordError } from "../errorHandler.js"; import { handleDiscordError } from "../errorHandler.js";
@ -355,4 +356,40 @@ export async function getServerInfoHandler(
} catch (error) { } catch (error) {
return handleDiscordError(error); return handleDiscordError(error);
} }
}
// List guilds handler
export async function listGuildsHandler(
args: unknown,
context: ToolContext
): Promise<ToolResponse> {
ListGuildsSchema.parse(args);
try {
if (!context.client.isReady()) {
return {
content: [{ type: "text", text: "Discord client not logged in." }],
isError: true
};
}
const guilds = await context.client.guilds.fetch();
if (guilds.size === 0) {
return {
content: [{ type: "text", text: "No guilds found. The bot is not a member of any servers." }]
};
}
const guildsInfo = guilds.map(guild => ({
id: guild.id,
name: guild.name,
icon: guild.iconURL()
}));
return {
content: [{ type: "text", text: JSON.stringify(guildsInfo, null, 2) }]
};
} catch (error) {
return handleDiscordError(error);
}
} }

View File

@ -17,7 +17,8 @@ import {
getServerInfoHandler, getServerInfoHandler,
createCategoryHandler, createCategoryHandler,
editCategoryHandler, editCategoryHandler,
deleteCategoryHandler deleteCategoryHandler,
listGuildsHandler
} from './channel.js'; } from './channel.js';
import { import {
addReactionHandler, addReactionHandler,
@ -55,7 +56,8 @@ export {
deleteWebhookHandler, deleteWebhookHandler,
createCategoryHandler, createCategoryHandler,
editCategoryHandler, editCategoryHandler,
deleteCategoryHandler deleteCategoryHandler,
listGuildsHandler
}; };
// Export common types // Export common types

View File

@ -26,7 +26,8 @@ import {
deleteWebhookHandler, deleteWebhookHandler,
editCategoryHandler, editCategoryHandler,
createCategoryHandler, createCategoryHandler,
deleteCategoryHandler deleteCategoryHandler,
listGuildsHandler
} from './tools/tools.js'; } from './tools/tools.js';
import { Client, GatewayIntentBits } from "discord.js"; import { Client, GatewayIntentBits } from "discord.js";
import { info, error } from './logger.js'; import { info, error } from './logger.js';