fix: resolve #27 and refresh README

fix #27 streamable-http startup crash and refresh README
This commit is contained in:
Barry Yip 2026-03-18 22:18:48 +08:00
parent eb522e2c3c
commit 188d3c1738
4 changed files with 111 additions and 111 deletions

205
README.md
View File

@ -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

4
package-lock.json generated
View File

@ -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",

View File

@ -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": {

View File

@ -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');
}