Skip to main content
Glama

extract_node_elements

Extract all design elements (images, vectors, components) from Figma nodes to analyze or export assets from your designs.

Instructions

提取节点中的所有设计元素(图片、矢量、组件)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYesFigma文件URL,必须包含node-id参数
includeDetailsNo是否包含详细信息,默认为false

Implementation Reference

  • Tool schema definition for 'extract_node_elements', including name, description, and input schema.
    {
      name: 'extract_node_elements',
      description: '提取节点中的所有设计元素(图片、矢量、组件)',
      inputSchema: {
        type: 'object',
        properties: {
          url: {
            type: 'string',
            description: 'Figma文件URL,必须包含node-id参数',
          },
          includeDetails: {
            type: 'boolean',
            description: '是否包含详细信息,默认为false',
            default: false,
          },
        },
        required: ['url'],
      },
    },
  • src/index.ts:215-216 (registration)
    Tool dispatch/registration in the switch statement for CallToolRequest.
    case 'extract_node_elements':
      return await this.handleExtractNodeElements(args);
  • Primary handler function for the 'extract_node_elements' tool, which delegates to FigmaElementExtractor and formats the response.
    private async handleExtractNodeElements(args: any) {
      const { url, includeDetails = false } = args;
    
      try {
        console.error(`开始提取节点设计元素: ${url}`);
        
        const elements = await this.elementExtractor.getElementsFromUrl(url);
        
        console.error(`成功提取设计元素: ${elements.totalElements} 个`);
        
        const responseData: any = {
          success: true,
          data: {
            nodeId: elements.nodeId,
            nodeName: elements.nodeName,
            summary: {
              totalElements: elements.totalElements,
              images: elements.images.length,
              vectors: elements.vectors.length,
              components: elements.components.length,
            },
            elements: includeDetails ? {
              images: elements.images,
              vectors: elements.vectors,
              components: elements.components,
            } : undefined,
          },
        };
    
        // 如果不包含详细信息,提供可读的摘要
        if (!includeDetails) {
          responseData.data.textSummary = this.elementExtractor.generateElementsSummary(elements);
        }
        
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(responseData, null, 2),
            },
          ],
        };
      } catch (error) {
        const errorMessage = error instanceof Error ? error.message : '未知错误';
        console.error(`提取设计元素失败: ${errorMessage}`);
        
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify({
                success: false,
                error: errorMessage,
                troubleshooting: {
                  commonIssues: [
                    '检查Figma URL是否包含node-id参数',
                    '确认对该文件和节点有访问权限',
                    '验证节点是否存在且包含设计元素',
                  ],
                  tip: '使用includeDetails=true获取详细的元素信息'
                }
              }, null, 2),
            },
          ],
        };
      }
    }
  • Handler method in FigmaElementExtractor that parses the Figma URL and invokes the core element extraction logic.
    async getElementsFromUrl(figmaUrl: string): Promise<NodeElements> {
      try {
        const urlInfo = this.figmaService.parseUrl(figmaUrl);
        const { fileId, nodeId } = urlInfo;
    
        if (!nodeId) {
          throw new Error('URL中缺少节点ID,无法提取设计元素。请确保URL包含node-id参数');
        }
    
        return await this.getAllNodeElements(fileId, nodeId);
      } catch (error) {
        throw new Error(`从URL获取设计元素失败: ${error instanceof Error ? error.message : '未知错误'}`);
      }
    }
  • Core helper function that extracts images, vectors, and components from a Figma node using parallel calls and tree traversal.
    async getAllNodeElements(fileId: string, nodeId: string): Promise<NodeElements> {
      try {
        const node = await this.figmaService.getNodeDetails(fileId, nodeId);
        if (!node) {
          throw new Error(`节点 ${nodeId} 不存在`);
        }
    
        const [images, vectors] = await Promise.all([
          this.getNodeImages(fileId, nodeId),
          this.extractVectorElements(fileId, nodeId)
        ]);
    
        // 收集组件节点
        const components: any[] = [];
        this.figmaService.traverseNodeTree(node, (currentNode) => {
          if (currentNode.type === 'COMPONENT' || currentNode.type === 'INSTANCE') {
            components.push({
              id: currentNode.id,
              name: currentNode.name,
              type: currentNode.type,
              componentId: currentNode.componentId || undefined
            });
          }
        });
    
        return {
          nodeId,
          nodeName: node.name || 'Unnamed Node',
          images,
          vectors,
          components,
          totalElements: images.length + vectors.length + components.length
        };
      } catch (error) {
        throw new Error(`获取节点元素失败: ${error instanceof Error ? error.message : '未知错误'}`);
      }
    }

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/Echoxiawan/figma-mcp-full-server'

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