From 188d3c173829da1b04feed1af709004515886c34 Mon Sep 17 00:00:00 2001 From: Barry Yip Date: Wed, 18 Mar 2026 22:18:48 +0800 Subject: [PATCH] fix: resolve #27 and refresh README fix #27 streamable-http startup crash and refresh README --- README.md | 205 +++++++++++++++++++++---------------------- package-lock.json | 4 +- package.json | 2 +- src/notifications.ts | 11 +-- 4 files changed, 111 insertions(+), 111 deletions(-) diff --git a/README.md b/README.md index d6ada56..75ad2f5 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,16 @@ MCP-Discord provides the following Discord-related functionalities: - Login to Discord bot - List servers the bot is a member of - Get server information +- List members and inspect member details +- List, create, edit, delete, assign, and remove roles - Search messages in a server -- Read/delete channel messages -- Send messages to specified channels (using either channel IDs or channel names) +- Read, edit, and delete channel messages +- Send messages to specified channels - Retrieve forum channel lists -- Create/delete/reply to forum posts -- Create/delete text channels +- Create, update, delete, and reply to forum posts +- List forum threads and manage forum tags +- Create, edit, and delete text, forum, voice channels, and categories +- Set and remove channel permission overrides - Add/remove message reactions - Create/edit/delete/use webhooks @@ -34,12 +38,14 @@ MCP-Discord provides the following Discord-related functionalities: - [Forum Functions](#forum-functions) - [Messages and Reactions](#messages-and-reactions) - [Webhook Management](#webhook-management) + - [Role Management](#role-management) + - [Member Management](#member-management) - [Development](#development) - [License](#license) ## Prerequisites -- Node.js (v16.0.0 or higher) +- Node.js (v18.0.0 or higher) - npm (v7.0.0 or higher) - A Discord bot with appropriate permissions - Bot token (obtainable from the [Discord Developer Portal](https://discord.com/developers/applications)) @@ -59,6 +65,7 @@ MCP-Discord provides the following Discord-related functionalities: - Manage Threads - Manage Channels - Manage Webhooks + - Manage Roles - Add Reactions - View Channel @@ -95,35 +102,22 @@ You can run mcp-discord using Docker. The Docker images are automatically built **Docker Hub Repository**: [barryy625/mcp-discord](https://hub.docker.com/r/barryy625/mcp-discord) -Docker container uses `stdio` by default. +Docker uses the streamable HTTP server by default via `build/app.js`. ```bash # Pull the latest image docker pull barryy625/mcp-discord:latest -# Run with environment variable -docker run -e DISCORD_TOKEN=your_discord_bot_token barryy625/mcp-discord:latest +# Run HTTP server on port 8080 +docker run -e DISCORD_TOKEN=your_discord_bot_token -p 8080:8080 barryy625/mcp-discord:latest -# Or run with command line config -docker run barryy625/mcp-discord:latest --config "your_discord_bot_token" -``` - -Alternatively, override the `--transport` and `--port` flags to run `http` on a port of your choosing. In this case, also map the ports. - -```bash -# Pull the latest image -docker pull barryy625/mcp-discord:latest - -# Run with environment variable -docker run -e DISCORD_TOKEN=your_discord_bot_token -p 8080:8080 barryy625/mcp-discord:latest --transport http --port 8081 - -# Or run with command line config -docker run -p 8080:8080 barryy625/mcp-discord:latest --config "your_discord_bot_token" --transport http --port 8081 +# Override the listening port if needed +docker run -e DISCORD_TOKEN=your_discord_bot_token -p 3000:3000 barryy625/mcp-discord:latest --transport http --port 3000 ``` **Available Tags:** - `latest` - Latest stable version from main branch -- `v1.3.3`, etc. - Specific version releases +- `v1.3.8`, etc. - Specific version releases ### Manual Installation ```bash @@ -168,147 +162,138 @@ DISCORD_TOKEN=your_discord_bot_token node build/index.js --config "your_discord_bot_token" # For streamable HTTP transport -node build/index.js --transport http --port 3000 --config "your_discord_bot_token" +node build/app.js --transport http --port 3000 --config "your_discord_bot_token" ``` ## Usage with Claude/Cursor -### Docker +### 1. Use Stdio Transport with Claude/Cursor -You can use Docker containers with both Claude and Cursor: +Use `build/index.js` when your MCP client expects a command-based stdio server. -```json -{ - "mcpServers": { - "discord": { - "command": "docker", - "args": [ - "run", - "--rm", - "-e", - "DISCORD_TOKEN=your_discord_bot_token", - "-p", - "8080:8080", - "barryy625/mcp-discord:latest", - "--transport", - "http", - "--port", - "8080" - ] - } - } -} -``` +#### Claude Desktop / Claude Code -### Claude - -1. Using stdio transport: ```json { "mcpServers": { "discord": { "command": "node", "args": [ - "path/to/mcp-discord/build/index.js", - "--config", - "your_discord_bot_token" - ] + "path/to/mcp-discord/build/index.js" + ], + "env": { + "DISCORD_TOKEN": "your_discord_bot_token" + } } } } ``` -2. Using streamable HTTP transport: +#### Cursor + ```json { "mcpServers": { "discord": { "command": "node", "args": [ - "path/to/mcp-discord/build/index.js", - "--transport", - "http", - "--port", - "3000", - "--config", - "your_discord_bot_token" - ] + "path/to/mcp-discord/build/index.js" + ], + "env": { + "DISCORD_TOKEN": "your_discord_bot_token" + } } } } ``` -### Cursor +This is the recommended setup for local command-based MCP clients. -1. Using stdio transport: -```json -{ - "mcpServers": { - "discord": { - "command": "cmd", - "args": [ - "/c", - "node", - "path/to/mcp-discord/build/index.js", - "--config", - "your_discord_bot_token" - ] - } - } -} +### 2. Self-Host the Streamable HTTP Server + +Use `build/app.js` when you want to run mcp-discord as an HTTP MCP server. + +#### Run with Node.js + +```bash +DISCORD_TOKEN=your_discord_bot_token node build/app.js --transport http --port 3000 ``` -2. Using streamable HTTP transport: -```json -{ - "mcpServers": { - "discord": { - "command": "cmd", - "args": [ - "/c", - "node", - "path/to/mcp-discord/build/index.js", - "--transport", - "http", - "--port", - "3000", - "--config", - "your_discord_bot_token" - ] - } - } -} +On Windows PowerShell: + +```powershell +$env:DISCORD_TOKEN="your_discord_bot_token" +node build/app.js --transport http --port 3000 ``` +#### Run with Docker + +```bash +docker run -e DISCORD_TOKEN=your_discord_bot_token -p 3000:3000 barryy625/mcp-discord:latest --transport http --port 3000 +``` + +Once started, the MCP HTTP endpoint is: + +```text +http://localhost:3000/mcp +``` + +### 3. Connect to a Hosted HTTP MCP Server + +If you already host mcp-discord elsewhere, point your MCP client at the server's `/mcp` endpoint instead of launching `build/app.js` as a command. + +Example endpoint: + +```text +https://your-server.example.com/mcp +``` + +Important notes: + +- `build/app.js` starts an HTTP server. It does not speak stdio. +- `build/index.js` is the correct entrypoint for command-based stdio MCP clients. +- For hosted HTTP usage, configure your MCP client to connect to the HTTP endpoint URL provided by your deployment. +- The exact HTTP-client configuration format depends on the MCP client you use. + ## Tools Documentation ### Basic Functions - `discord_login`: Login to Discord using the configured token - `discord_list_servers`: List all Discord servers the bot is a member of -- `discord_send`: Send a message to a specified channel (supports both channel ID and channel name) +- `discord_send`: Send a message to a specified channel - `discord_get_server_info`: Get Discord server information ### Channel Management - `discord_create_text_channel`: Create a text channel +- `discord_create_forum_channel`: Create a forum channel +- `discord_create_voice_channel`: Create a voice channel +- `discord_edit_channel`: Edit a channel name, topic, parent category, or position - `discord_delete_channel`: Delete a channel - `discord_create_category`: Create a channel category - `discord_edit_category`: Edit a channel category - `discord_delete_category`: Delete a channel category +- `discord_set_channel_permissions`: Set permission overrides for a role or user on a channel/category +- `discord_remove_channel_permissions`: Remove permission overrides from a channel/category ### Forum Functions - `discord_get_forum_channels`: Get a list of forum channels - `discord_create_forum_post`: Create a forum post - `discord_get_forum_post`: Get a forum post +- `discord_list_forum_threads`: List active and archived threads in a forum channel - `discord_reply_to_forum`: Reply to a forum post +- `discord_get_forum_tags`: Get all available tags for a forum channel +- `discord_set_forum_tags`: Replace the available tags for a forum channel +- `discord_update_forum_post`: Update a forum post's title, tags, archived state, or locked state - `discord_delete_forum_post`: Delete a forum post ### Messages and Reactions - `discord_search_messages`: Search messages in a server - `discord_read_messages`: Read channel messages +- `discord_edit_message`: Edit a bot-authored message - `discord_add_reaction`: Add a reaction to a message - `discord_add_multiple_reactions`: Add multiple reactions to a message - `discord_remove_reaction`: Remove a reaction from a message @@ -321,6 +306,20 @@ You can use Docker containers with both Claude and Cursor: - `discord_edit_webhook`: Edits an existing webhook for a Discord channel - `discord_delete_webhook`: Deletes an existing webhook for a Discord channel +### Role Management + +- `discord_list_roles`: List all roles in a server +- `discord_create_role`: Create a role with color, hoist, mentionable, and permission options +- `discord_edit_role`: Edit an existing role +- `discord_delete_role`: Delete a role +- `discord_assign_role`: Assign a role to a member +- `discord_remove_role`: Remove a role from a member + +### Member Management + +- `discord_list_members`: List members in a server with roles +- `discord_get_member`: Get detailed information about a specific member + ## Development ```bash diff --git a/package-lock.json b/package-lock.json index 63de826..2384ab0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mcp-discord", - "version": "1.3.4", + "version": "1.3.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mcp-discord", - "version": "1.3.4", + "version": "1.3.8", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.11.0", diff --git a/package.json b/package.json index 183399c..0fff5ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mcp-discord", - "version": "1.3.4", + "version": "1.3.8", "description": "Model Context Protocol (MCP) server for Discord integration, allowing Claude and other MCP clients to interact with Discord", "main": "build/index.js", "bin": { diff --git a/src/notifications.ts b/src/notifications.ts index a4d5d16..f956d56 100644 --- a/src/notifications.ts +++ b/src/notifications.ts @@ -1,4 +1,4 @@ -import { Server } from '@modelcontextprotocol/sdk/server' +import { Server } from '@modelcontextprotocol/sdk/server/index.js' export type Level = 'debug' | 'info' | 'notice' | 'warning' | 'error' | 'critical' | 'alert' | 'emergency'; @@ -21,8 +21,9 @@ export function setLevel(level: Level) { return true; } -export function log(server: Server, message: string, level: Level = 'info') { +export function log(server: Server | null | undefined, message: string, level: Level = 'info') { if (levelPriority[level] < levelPriority[currentLevel]) return; + if (!server?.transport) return; server.sendLoggingMessage( { level: level, @@ -32,14 +33,14 @@ export function log(server: Server, message: string, level: Level = 'info') { ); } -export function info(server: Server, message: string) { +export function info(server: Server | null | undefined, message: string) { log(server, message, 'info'); } -export function warning(server: Server, message: string) { +export function warning(server: Server | null | undefined, message: string) { log(server, message, 'warning'); } -export function error(server: Server, message: string) { +export function error(server: Server | null | undefined, message: string) { log(server, message, 'error'); }