Esta guía explica cómo conectar servidores externos de Model Context Protocol (MCP) a los agentes de Discourse AI, permitiendo que cualquier proveedor de herramientas compatible con MCP sea utilizado directamente dentro del bot de IA.
Nivel de usuario requerido: Administrador
¿Qué es “Bring Your Own MCP”?
Model Context Protocol es un estándar abierto (propuesto originalmente por Anthropic) que permite a los agentes de IA comunicarse con servidores de herramientas externos a través de una interfaz estándar HTTP/JSON-RPC. Un servidor MCP expone un menú de “herramientas” —funciones con entradas tipadas— que un LLM puede llamar para realizar tareas.
Discourse AI actúa ahora como un cliente MCP. Puedes registrar cualquier servidor MCP HTTPS en el panel de administración, Discourse descubre sus herramientas disponibles y estas se convierten en ciudadanos de primera clase dentro de cualquier agente de IA que elijas. No hay JavaScript que escribir; las herramientas están definidas por el servidor remoto.
Esto difiere de las herramientas de scripts personalizados que requieren escribir JavaScript que se ejecuta dentro de Discourse. Con MCP, traes un servidor externo que ya está en ejecución.
Resumen
- Registrar un servidor MCP (URL + autenticación opcional)
- Discourse descubre y almacena en caché automáticamente las herramientas del servidor
- Asignar el servidor a uno o varios agentes de IA
- Opcionalmente limitar qué herramientas puede usar cada agente
- Las herramientas son llamadas por el LLM en tiempo de ejecución, enrutadas a través de Discourse hacia el servidor externo
Registro de un servidor MCP
Navega a:
Admin → Plugins → Discourse AI → Tools → Pestaña MCP servers → New MCP server
Rellena los siguientes campos:
| Campo | Descripción |
|---|---|
| Name | Una etiqueta legible (mostrada en el editor del agente y en los registros) |
| Description | Para qué sirve este servidor (referencia para administradores) |
| URL | El punto de conexión HTTPS del servidor MCP; debe ser una URL HTTPS pública, sin direcciones IP privadas |
| Authentication | Una de las siguientes opciones: Sin autenticación, Credencial de encabezado o OAuth |
| Timeout (seconds) | Tiempo que Discourse espera por solicitud; por defecto 30, máximo 300 |
| Enabled | Interruptor para desactivar temporalmente el servidor sin eliminarlo |
Las URL deben usar HTTPS.
localhosty las direcciones privadas RFC-1918 están bloqueadas (la protección SSRF se aplica del lado del servidor).
Opciones de autenticación
Sin autenticación
El servidor es accesible públicamente. No se envían credenciales.
Credencial de encabezado
Un valor secreto se inyecta como un encabezado HTTP en cada solicitud.
- Primero crea una Credential en Admin → AI → Credentials
- Selecciónala como Credential en el formulario del servidor MCP
- Establece el nombre del Auth header (por defecto:
Authorization) - Establece el prefijo opcional Auth scheme (por defecto:
Bearer)
El encabezado de solicitud enviado al servidor MCP será:
Authorization: Bearer <tu-valor-secreto>
Puedes cambiar tanto el nombre del encabezado como el esquema para coincidir con cualquier estilo de autenticación que requiera tu servidor (por ejemplo, X-Api-Key: <valor> dejando el esquema en blanco).
OAuth
Discourse implementa un flujo completo de OAuth 2.0 + PKCE como cliente MCP. Esto soporta servidores MCP que protegen sus herramientas detrás de OAuth.
Pasos de configuración:
- Establece Authentication en
OAuth - Elige Client registration:
- Client metadata document (por defecto) — Discourse publica su propio metadato de cliente OAuth en
https://tu-sitio.com/discourse-ai/mcp/oauth/client-metadata. Si el servidor MCP soporta RFC 7591 Dynamic Client Registration, Discourse se registrará automáticamente - Manual client credentials — ingresa tu OAuth client ID pre-registrado y selecciona una credencial de OAuth client secret
- Client metadata document (por defecto) — Discourse publica su propio metadato de cliente OAuth en
- Opcionalmente establece OAuth scopes (separados por espacios)
- Guarda el servidor
- Haz clic en Connect — Discourse te redirigirá a través de la página de autorización del proveedor
- Después de autorizar, serás devuelto al panel de administración y el estado mostrará Connected
Opciones avanzadas de OAuth (activa “Show advanced options”):
| Opción | Propósito |
|---|---|
| OAuth authorization params | Objeto JSON fusionado en la solicitud de autorización (ej. {"access_type":"offline"}) |
| OAuth token params | Objeto JSON fusionado en las solicitudes de intercambio de tokens |
| Require refresh token | Fallar la conexión si el proveedor no devuelve un token de refresco |
Discourse actualiza automáticamente los tokens de acceso antes de su expiración y reintenta en caso de 401 si hay un token de refresco disponible.
Probar la conexión
Antes de asignar un servidor a un agente, usa el botón Test connection en el formulario del editor. Esto inicializa inmediatamente una sesión MCP, llama a tools/list y devuelve:
- Versión del protocolo MCP negociada
- Número de herramientas descubiertas
- Nombres de todas las herramientas
Si la prueba falla, se mostrará el mensaje de error del servidor (o un indicador de tiempo de espera) en línea.
Cómo Discourse descubre las herramientas
Discourse sigue la especificación MCP 2025-03-26. La secuencia de conexión es:
Discourse → POST / { method: "initialize", params: { protocolVersion, capabilities, clientInfo } }
Server → { result: { protocolVersion, capabilities } } + Encabezado Mcp-Session-Id
Discourse → POST / { method: "notifications/initialized" } (apretón de manos de sesión completado)
Discourse → POST / { method: "tools/list", session_id: … }
Server → { result: { tools: [ { name, description, inputSchema } … ] } }
Las definiciones de herramientas se almacenan en caché por 1 hora por servidor. Después de que la caché expira, un trabajo en segundo plano la actualiza transparentemente. La clave de caché es por sitio/servidor, por lo que las instalaciones multi-sitio están aisladas.
También puedes activar manualmente una actualización haciendo clic en Test connection; esto siempre obtiene datos en vivo.
El estado de salud del servidor (healthy / error) se actualiza en cada actualización de caché.
Asignación de servidores MCP a agentes de IA
Una vez registrado un servidor, asígnalo a un agente:
- Ve a Admin → Plugins → Discourse AI → Agents y edita o crea un agente
- Desplázate hasta la sección MCP servers (debajo de la sección regular de Tools)
- La lista muestra todos los servidores MCP habilitados con su recuento de herramientas y el costo estimado de tokens
- Activa un servidor; ahora está disponible para ese agente
Consejo: Por defecto, todas las herramientas de un servidor están disponibles para el agente. La cadena de localización lo dice bien: “Selected MCP servers expose all of their tools by default. Narrow them per agent to reduce token usage and keep tool choice focused.”
Selección de herramientas específicas por agente
Tener docenas de herramientas disponibles aumenta el costo de tokens de cada mensaje (cada definición de herramienta se envía al modelo en el prompt del sistema). Para mantener las cosas ligeras:
- En el editor del agente, junto a un servidor MCP asignado, haz clic en Choose tools
- Un modal muestra cada herramienta que el servidor expone actualmente, con su descripción y lista de parámetros
- Marca solo las herramientas que necesita este agente
- Haz clic en Guardar; el agente ahora solo verá el subconjunto seleccionado
La tabla de unión ai_agent_mcp_servers almacena selected_tool_names como un array JSONB. Un array vacío significa “todas las herramientas habilitadas”.
Nomenclatura de herramientas y resolución de conflictos
Los nombres de las herramientas MCP deben ser únicos dentro de la lista de herramientas de un solo agente (incluidas las herramientas integradas y de scripts personalizados del agente). Discourse maneja los conflictos automáticamente:
- Si dos servidores MCP diferentes exponen una herramienta con el mismo nombre, Discourse las asigna a un espacio de nombres:
servername__toolname - Si una herramienta integrada de Discourse y una herramienta MCP comparten un nombre, la herramienta MCP también se asigna a un espacio de nombres
- Si aún hay colisiones después de la asignación de espacio de nombres, se agrega un sufijo numérico (
_2,_3, …)
Por lo tanto, el function_name usado en la llamada del LLM puede diferir del tool_name crudo en el servidor MCP. Esto se maneja transparentemente; la clase de herramienta MCP siempre almacena el tool_name_value original por separado y lo usa al llamar al servidor.
Cómo funcionan las llamadas a herramientas en tiempo de ejecución
Cuando el LLM decide usar una herramienta MCP:
- Reutilización de sesión: Discourse busca un ID de sesión MCP en caché para este servidor en el contexto actual del bot (
context.mcp_state). Las sesiones se crean por cadena de respuesta del bot y se reutilizan entre llamadas a herramientas hacia el mismo servidor. - Inicializar si es necesario: Si no existe una sesión, se ejecuta un nuevo apretón de manos
initialize+notifications/initialized. - Llamar:
POST /con{ method: "tools/call", params: { name: tool_name, arguments: params } } - Expiración de sesión: Si el servidor devuelve
404(sesión expirada), Discourse se re-inicializa automáticamente y reintenta una vez. - Normalización de respuesta: Los elementos de contenido MCP de tipo
textse concatenan. Los elementos no textuales se serializan en JSON.structuredContentse imprime en JSON con formato. - Resultado de error: Si el servidor devuelve
isError: true, el bot recibe un mensaje de error en lugar de un resultado.
La respuesta del servidor puede ser JSON plano o un flujo SSE; Discourse maneja ambos.
Visualización del costo de tokens
En el editor del agente, cada servidor MCP asignado muestra un recuento estimado de tokens. Esto se calcula utilizando el tokenizador OpenAI cl100k_base aplicado a la firma JSON completa de cada herramienta (nombre + descripción + esquema de entrada). Esto es una aproximación; el costo real depende del tokenizador de tu LLM.
El desglose del costo de tokens se muestra para ayudarte a tomar decisiones informadas sobre qué servidores y herramientas asignar a un agente dado.
Solución de problemas
| Síntoma | Qué verificar |
|---|---|
| Test connection falla con timeout | Aumenta Timeout (seconds). Por defecto es 30. Si el servidor es lento para inicializarse, prueba con 60–120. |
| Test tiene éxito pero las herramientas no aparecen en el agente | Asegúrate de que el servidor esté Enabled y de que el agente lo tenga activado en su sección de servidores MCP. |
| El estado de OAuth muestra “Needs attention” | El último error de OAuth se muestra en el formulario del editor. Causas comunes: token de refresco expirado (haz clic en Reconnect), el servidor devolvió scopes inesperados, o la URL de metadatos del cliente no es accesible desde tu servidor. |
Los nombres de las herramientas se ven como myserver__sometool |
Normal; otra herramienta (integrada o de otro servidor) tenía el mismo nombre. El LLM ve y usa automáticamente este nombre con espacio de nombres. |
| La salud muestra “error” después de un tiempo | El trabajo de actualización en segundo plano no pudo alcanzar el servidor. Revisa /logs en tu sitio y verifica que el servidor MCP sea accesible desde el host de Discourse. |
| Las herramientas dejaron de funcionar a mitad de la conversación | Expiración de sesión. Discourse reintenta automáticamente una vez por llamada a herramienta, pero si el servidor se reinicia constantemente, acorta su TTL de sesión o investiga los registros del lado del servidor. |
Para una depuración más profunda, habilita el acceso a las transcripciones de IA mediante ai_bot_debugging_allowed_groups e inspecciona el registro completo de la conversación.
Referencia técnica
Detalles del protocolo MCP
| Propiedad | Valor |
|---|---|
| Versión del protocolo | 2025-03-26 |
| Transporte | HTTP POST (JSON-RPC 2.0) |
| Soporte SSE | Sí (para respuestas en flujo de tools/call) |
| Gestión de sesiones | Encabezado HTTP Mcp-Session-Id |
| Tamaño máximo de respuesta | 5 MB |
| User-Agent del cliente | Discourse AI MCP Client / <version> |
Soporte de esquemas JSON
Discourse resuelve las siguientes construcciones de JSON Schema en las definiciones de inputSchema de las herramientas antes de pasarlas al LLM:
$ref— resuelto contra$defs/definitionsdel esquema raízallOf— fusionado (las propiedades y los arrays requeridos se unen)anyOf/oneOf— se usa la primera variante que no seanull
Archivos de origen relevantes
plugins/discourse-ai/lib/mcp/client.rb— Cliente HTTP MCP (sesión, llamada, reintento OAuth)plugins/discourse-ai/lib/mcp/tool_registry.rb— Caché de herramientas, resolución de conflictosplugins/discourse-ai/lib/agents/tools/mcp.rb— Clase de herramienta que envuelve las llamadas MCP para el tiempo de ejecución del agenteplugins/discourse-ai/app/models/ai_mcp_server.rb— Modelo de servidor, gestión de tokens OAuthplugins/discourse-ai/app/models/ai_agent_mcp_server.rb— Selección de herramientas por agenteplugins/discourse-ai/lib/mcp/oauth_flow.rb— Flujo OAuth 2.0 + PKCE
Temas relacionados
- AI Bot – Custom Tools (script-based)
- Discourse AI persona / agent guide
- Discourse MCP is here! (Discourse as an MCP server)
La función de Discourse como servidor MCP (discourse/discourse-mcp) es el complemento de esto: permite que clientes externos de IA (Claude Code, Cursor, etc.) lean y escriban en tu sitio de Discourse. Esta guía es la inversa; permite que tus agentes de IA de Discourse llamen a servidores MCP externos.