Skip to main content
Glama
04-tools-refactor-channel-error.md5.15 kB
# Problema y Solución: Error "Must join a channel before sending commands" ## Problema Identificado Durante las pruebas de las herramientas refactorizadas, se ha identificado un problema crítico: - La herramienta `join_channel` funciona correctamente y permite unirse a un canal de Figma - Sin embargo, todas las herramientas subsiguientes fallan con el error: **"Error getting document info: Must join a channel before sending commands"** ### Análisis del Problema Después de revisar el código, hemos identificado la causa raíz: 1. En el archivo `utils/websocket.ts`, la función `sendCommandToFigma` verifica que exista un canal actual antes de enviar comandos: ```typescript const requiresChannel = command !== "join"; if (requiresChannel && !currentChannel) { reject(new Error("Must join a channel before sending commands")); return; } ``` 2. En la implementación de la herramienta `join_channel` en `document-tools.ts`, se estaba usando el comando "join" correctamente: ```typescript await sendCommandToFigma("join", { channel: channel }); ``` 3. Sin embargo, existía una inconsistencia entre cómo se maneja el comando "join" y cómo se actualiza la variable `currentChannel`: - La función `joinChannel` en `websocket.ts` establece `currentChannel = channelName` después de una unión exitosa - Pero la herramienta `join_channel` llamaba directamente a `sendCommandToFigma("join", ...)` en lugar de usar la función `joinChannel` - Como resultado, aunque el comando "join" se ejecutaba correctamente, la variable `currentChannel` no se actualizaba ## Solución Implementada La solución implicó una modificación en la herramienta `join_channel` para asegurar que se actualice correctamente la variable `currentChannel`: ```typescript // Join Channel Tool - Versión corregida server.tool( "join_channel", "Join a specific channel to communicate with Figma", { channel: z.string().describe("The name of the channel to join").default(""), }, async ({ channel }) => { try { if (!channel) { // If no channel provided, ask the user for input return { content: [ { type: "text", text: "Please provide a channel name to join:", }, ], followUp: { tool: "join_channel", description: "Join the specified channel", }, }; } // Reemplazar la llamada directa a sendCommandToFigma con joinChannel // para asegurar que currentChannel se actualice correctamente await joinChannel(channel); return { content: [ { type: "text", text: `Successfully joined channel: ${channel}`, }, ], }; } catch (error) { return { content: [ { type: "text", text: `Error joining channel: ${error instanceof Error ? error.message : String(error)}`, }, ], }; } } ); ``` ### Cambios Clave Implementados: 1. Se reemplazó `await sendCommandToFigma("join", { channel: channel });` con `await joinChannel(channel);` 2. La función `joinChannel` maneja internamente: - Enviar el comando "join" a Figma - Actualizar la variable `currentChannel` - Manejar errores apropiadamente ### Detalles de la Implementación Para implementar esta solución: 1. Se modificó el archivo `src/talk_to_figma_mcp/tools/document-tools.ts` 2. Se añadió la importación de la función `joinChannel` desde `../utils/websocket.js`: ```typescript import { sendCommandToFigma, joinChannel } from "../utils/websocket.js"; ``` 3. Se reemplazó la implementación anterior de la herramienta `join_channel` con la versión corregida 4. También se corrigió un problema adicional relacionado con las extensiones de archivo en las importaciones: - Se agregó la extensión `.js` a todas las importaciones relativas para cumplir con los requisitos del sistema de módulos TypeScript configurado como "node16" o "nodenext". ## Impacto del Cambio Este cambio garantiza que: - La variable `currentChannel` se actualiza correctamente después de unirse a un canal - Todas las herramientas subsiguientes pueden enviar comandos a Figma correctamente - Se mantiene la consistencia en cómo se manejan los canales en todo el código ## Estado de Validación - [x] Cambio implementado - [x] Pruebas realizadas - [x] Funcionalidad verificada ## Lecciones Aprendidas Este problema resalta la importancia de: 1. **Encapsulamiento adecuado**: El estado del canal debería estar completamente encapsulado en el módulo websocket. 2. **Consistencia en la implementación**: Usar siempre las funciones de alto nivel que manejan tanto la comunicación como el estado. 3. **Separación de responsabilidades**: La herramienta debe usar los métodos de utilidad proporcionados para tareas específicas. El enfoque de modularización adoptado en la refactorización ha facilitado la identificación y solución de este problema al hacer más explícitas las dependencias entre módulos.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mulerrr/figma-mcp-mini'

If you have feedback or need assistance with the MCP directory API, please join our Discord server