From 00dae9e4261a7244153c00f50936a2bf0214bae8 Mon Sep 17 00:00:00 2001 From: IAPP-BY Date: Tue, 10 Jun 2025 14:56:00 +0800 Subject: [PATCH] Re-enable the discord_login tools --- Dockerfile | 2 +- src/server.ts | 4 ++++ src/toolList.ts | 11 +++++++++++ src/transport.ts | 43 +++++++++++++++++++++++++++++++++++-------- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 10d0ca8..1507fc4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,5 +22,5 @@ ENV DISCORD_TOKEN="" # Expose HTTP port EXPOSE 8080 -# Default command to run the MCP server with HTTP transport and Discord token +# Default command to run the MCP server with HTTP transport CMD ["node", "build/index.js", "--transport", "http", "--port", "8080"] \ No newline at end of file diff --git a/src/server.ts b/src/server.ts index f7f54f1..9983e7a 100644 --- a/src/server.ts +++ b/src/server.ts @@ -84,6 +84,10 @@ export class DiscordMCPServer { toolResponse = await deleteCategoryHandler(args, this.toolContext); return toolResponse; + case "discord_login": toolResponse = await loginHandler(args, this.toolContext); + this.logClientState("after discord_login handler"); + return toolResponse; + case "discord_send": this.logClientState("before discord_send handler"); toolResponse = await sendMessageHandler(args, this.toolContext); diff --git a/src/toolList.ts b/src/toolList.ts index 847c88a..bf4b939 100644 --- a/src/toolList.ts +++ b/src/toolList.ts @@ -39,6 +39,17 @@ export const toolList = [ required: ["categoryId"] } }, + { + name: "discord_login", + description: "Logs in to Discord using the configured token", + inputSchema: { + type: "object", + properties: { + token: { type: "string" } + }, + required: [] + } + }, { name: "discord_send", description: "Sends a message to a specified Discord text channel", diff --git a/src/transport.ts b/src/transport.ts index b4d7e0b..aebf81d 100644 --- a/src/transport.ts +++ b/src/transport.ts @@ -177,6 +177,19 @@ export class StreamableHttpTransport implements MCPTransport { result = { tools: toolList }; break; + case 'discord_login': + result = await loginHandler(params, this.toolContext!); + // Log client state after login + info(`Client state after login: ${JSON.stringify({ + isReady: this.toolContext!.client.isReady(), + hasToken: !!this.toolContext!.client.token, + user: this.toolContext!.client.user ? { + id: this.toolContext!.client.user.id, + tag: this.toolContext!.client.user.tag, + } : null + })}`); + break; + // Make sure Discord client is logged in for other Discord API tools // but return a proper JSON-RPC error rather than throwing an exception case 'discord_send': @@ -225,7 +238,7 @@ export class StreamableHttpTransport implements MCPTransport { jsonrpc: '2.0', error: { code: -32603, - message: 'Discord client reconnect failed.', + message: 'Discord client reconnect failed. Please use discord_login tool first.', }, id: req.body?.id || null, }); @@ -239,7 +252,7 @@ export class StreamableHttpTransport implements MCPTransport { jsonrpc: '2.0', error: { code: -32603, - message: 'Discord client reconnect failed.', + message: 'Discord client reconnect failed. Please use discord_login tool first.', }, id: req.body?.id || null, }); @@ -249,7 +262,7 @@ export class StreamableHttpTransport implements MCPTransport { jsonrpc: '2.0', error: { code: -32603, - message: 'Discord client not logged in.', + message: 'Discord client not logged in. Please use discord_login tool first.', }, id: req.body?.id || null, }); @@ -333,7 +346,8 @@ export class StreamableHttpTransport implements MCPTransport { const toolArgs = params.arguments || {}; // Check if Discord client is logged in for Discord API tools - if (toolName.startsWith('discord_') && + if (toolName !== 'discord_login' && + toolName.startsWith('discord_') && !this.toolContext!.client.isReady()) { error(`Client not ready for tool ${toolName}, client state: ${JSON.stringify({ isReady: this.toolContext!.client.isReady(), @@ -358,7 +372,7 @@ export class StreamableHttpTransport implements MCPTransport { jsonrpc: '2.0', error: { code: -32603, - message: 'Discord client reconnect failed.', + message: 'Discord client reconnect failed. Please use discord_login tool first.', }, id: req.body?.id || null, }); @@ -372,7 +386,7 @@ export class StreamableHttpTransport implements MCPTransport { jsonrpc: '2.0', error: { code: -32603, - message: 'Discord client reconnect failed.', + message: 'Discord client reconnect failed. Please use discord_login tool first.', }, id: req.body?.id || null, }); @@ -382,7 +396,7 @@ export class StreamableHttpTransport implements MCPTransport { jsonrpc: '2.0', error: { code: -32603, - message: 'Discord client not logged in.', + message: 'Discord client not logged in. Please use discord_login tool first.', }, id: req.body?.id || null, }); @@ -390,7 +404,20 @@ export class StreamableHttpTransport implements MCPTransport { } // Call the appropriate handler based on tool name - switch (toolName) { + switch (toolName) { + case 'discord_login': + result = await loginHandler(toolArgs, this.toolContext!); + // Log client state after login + info(`Client state after login: ${JSON.stringify({ + isReady: this.toolContext!.client.isReady(), + hasToken: !!this.toolContext!.client.token, + user: this.toolContext!.client.user ? { + id: this.toolContext!.client.user.id, + tag: this.toolContext!.client.user.tag, + } : null + })}`); + break; + case 'discord_send': result = await sendMessageHandler(toolArgs, this.toolContext!); break;