betterdiscord-mcp

Un servidor MCP que permite a un agente de IA (como Claude) leer datos de servidores de Discord a través de tu propia cuenta. Se empareja con un plugin de BetterDiscord, por lo que el lado de Python nunca maneja tu token — los datos se leen directamente desde el cliente de Discord ya autenticado.

Documentación

betterdiscord-mcp

Un servidor MCP que permite a un agente de IA (como Claude) leer datos de servidores de Discord a través de tu propia cuenta. Se complementa con un plugin de BetterDiscord, por lo que el lado de Python nunca maneja tu token — los datos se leen directamente del cliente de Discord ya autenticado.

Claude ──stdio──> Python MCP ──WebSocket──> BetterDiscord plugin ──> Discord

⚠️ Aviso legal — lee esto primero

Esta es una herramienta de self-bot. Automatizar una cuenta personal de Discord y modificar el cliente (BetterDiscord) viola los Términos de Servicio de Discord y puede resultar en la suspensión de tu cuenta.

  • Úsalo solo en tu propia cuenta y bajo tu propio riesgo.
  • Los autores no se hacen responsables por cuentas suspendidas ni por cualquier otra consecuencia.
  • Leer datos ya cargados del cliente es más discreto que un self-bot HTTP crudo, pero el riesgo no es cero. Haz solicitudes con poca frecuencia y en lotes pequeños.
  • No lo uses para recopilar, redistribuir o publicar datos privados de otras personas. Respeta la privacidad de los servidores en los que estás.

Si no te sientes cómodo con estos términos, usa un bot oficial de Discord a través del Portal de Desarrolladores.

Requisitos

  • Python 3.10+
  • uv (gestor de paquetes/entorno)
  • BetterDiscord instalado
  • Un cliente compatible con MCP (Claude Desktop o Claude Code)

Instalación

1. Servidor Python (vía uv):

git clone https://github.com/encryrose/betterdiscord-mcp.git
cd betterdiscord-mcp
uv sync

2. Plugin de BetterDiscord:

  • Copia plugin/DiscordMcpBridge.plugin.js en tu carpeta de plugins de BD:
    • Windows: %AppData%\BetterDiscord\plugins\
    • macOS: ~/Library/Application Support/BetterDiscord/plugins/
    • Linux: ~/.config/BetterDiscord/plugins/
  • En Discord: Configuración → Plugins → activa DiscordMcpBridge.
  • Asegúrate de que BRIDGE_PORT en la parte superior del plugin coincida con tu .env (por defecto 8787).

3. Registra el servidor MCP con tu cliente:

Claude Code (CLI):

claude mcp add discord -- uv --directory /path/to/betterdiscord-mcp run discord-mcp

Claude Desktop — añade a claude_desktop_config.json:

{
  "mcpServers": {
    "discord": {
      "command": "uv",
      "args": ["--directory", "/path/to/betterdiscord-mcp", "run", "discord-mcp"]
    }
  }
}

Reemplaza /path/to/betterdiscord-mcp con la ruta absoluta donde clonaste el repositorio. Si uv no está en el PATH de tu cliente, usa la ruta completa al ejecutable uv en command.

Cómo funciona

  1. Al iniciar, el servidor MCP abre un puente WebSocket en 127.0.0.1:8787.
  2. El plugin dentro de Discord se conecta al puente (verás una notificación de "bridge connected").
  3. El agente llama a las herramientas; el plugin lee las tiendas internas de Flux de Discord y devuelve los datos.

Ningún token se envía al lado de Python — el plugin se ejecuta dentro de tu cliente ya autenticado.

Herramientas

HerramientaPropósito
bridge_statusVerifica si el plugin está conectado
pingVerificación de salud ligera: versión del plugin + mapa de módulos resueltos
diagnosticsMuestra qué módulos internos de Discord se resolvieron (depuración)
list_guildsLista los servidores que el cliente puede ver
list_channelsLista los canales de texto de un servidor
get_messagesLee el historial de un canal (pagina con before; filtra por author_id / after; humanize resuelve menciones)
search_messagesBúsqueda nativa de Discord en un servidor
search_localBúsqueda de texto completo sin conexión (SQLite FTS5) sobre exports/*.json
get_message_by_linkObtiene un solo mensaje desde un enlace de mensaje de Discord
get_reactionsLista los usuarios que reaccionaron a un mensaje con un emoji dado
list_dmsLista los DMs directos y grupales de la cuenta
list_threadsLista hilos o publicaciones de foro (carga publicaciones de foro no almacenadas en caché; incluye first_message)
list_threads_paginatedHilos/publicaciones de foro paginados (offset/limit, devuelve {threads, hasMore, total})
read_threadLee los mensajes de un hilo / publicación de foro en orden cronológico
get_pinsLista los mensajes fijados de un canal o hilo
get_channel_infoMetadatos de un canal o hilo
get_guild_infoMetadatos del servidor: roles, canales, número de miembros, características, nivel de impulso
resolve_idClasifica cualquier snowflake como servidor/canal/hilo/usuario/mensaje
list_membersMiembros actualmente conocidos por el cliente (resolve_role_names añade nombres de roles)
get_rolesLista los roles de un servidor (id, nombre, color, posición, permisos)
get_user_infoBusca un usuario por id
export_channelVuelca el historial de un canal a exports/*.json
export_attachmentsDescarga los adjuntos de un canal a exports/ con un manifiesto
download_attachmentDescarga un solo adjunto del CDN de Discord a exports/
channel_statsAnálisis sin conexión desde una exportación de canal (por usuario, línea de tiempo, gráfico de respuestas)

Flujo típico

Comienza con bridge_status. Si está conectado: list_guildslist_channelsget_messages / search_messages / export_channel.

Solución de problemas

  • "Plugin not connected" — ¿Está Discord ejecutándose? ¿Está el plugin habilitado? ¿Coinciden los puertos en .env y el plugin?
  • "Module not found" / "is not a function" — Discord se actualizó y los selectores de Webpack en _resolveModules() se desviaron. Ejecuta diagnostics para ver qué se resolvió, luego corrige los filtros de módulos.
  • Historial vacío — Desplázate manualmente por el canal una vez para que el cliente cargue los mensajes, luego reintenta.

Desarrollo

Instala el proyecto junto con sus herramientas de desarrollo (pytest, pytest-asyncio, ruff):

uv sync --group dev

Ejecuta la suite de pruebas:

uv run pytest

Lint del código:

uv run ruff check .

Las pruebas viven en tests/ y ejercitan el puente WebSocket (discord_mcp.bridge.Bridge) directamente: inician el servidor en un puerto poco común, conectan un plugin falso con el cliente websockets, y verifican que un round-trip JSON-RPC devuelve el resultado esperado. No se necesita un cliente real de Discord.

Registro con Claude Code

Una vez instalado, registra el servidor con Claude Code:

claude mcp add discord -- uv --directory /path/to/betterdiscord-mcp run discord-mcp

Reemplaza /path/to/betterdiscord-mcp con la ruta absoluta a tu clon.

Integración continua

GitHub Actions (.github/workflows/ci.yml) se ejecuta en cada push y pull request con dos trabajos:

  • python — instala uv, ejecuta uv sync --group dev, luego uv run ruff check . y uv run pytest -q.
  • plugin-syntax — valida el plugin de BetterDiscord con node --check plugin/DiscordMcpBridge.plugin.js.

Capturas de pantalla

TODO: añadir un GIF corto del agente leyendo un canal.

Licencia

MIT — ver LICENSE. Se proporciona tal cual, sin garantía. El uso de este software es tu responsabilidad.