Skip to main content
Glama

generate_etsy_seo

Generate SEO-optimized Etsy product titles, descriptions, and tags to help your listings rank higher in search results and attract more customers.

Instructions

Generate SEO-optimized Etsy product title, description, and tags. Free: 10 generations/month.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
categoryNoOptional product category (e.g., "Home & Living")
product_nameYesThe product name to generate SEO for

Implementation Reference

  • The core handler function `generateEtsySEO` that validates credentials, constructs a signed payload, calls the Seerxo API, and returns the generated Etsy SEO content (title, description, tags, suggested price, usage).
    async function generateEtsySEO(productName, category = '') {
      if (!userEmail) {
        throw new Error('Email is not set. Run "seerxo configure" first.');
      }
      if (!apiKeyHeader || !apiKeySecret) {
        throw new Error('API key is not set. Run "seerxo configure" first.');
      }
    
      try {
        const payload = {
          product_name: productName,
          category: category || '',
          email: userEmail,
        };
    
        const { signature, timestamp } = generateSignature(payload);
    
        const response = await fetch(getApiEndpoint(), {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            'User-Agent': `seerxo/${clientVersion}`,
            'X-MCP-Signature': signature,
            'X-MCP-Timestamp': timestamp.toString(),
            'X-MCP-Version': clientVersion,
            'X-MCP-API-Key': apiKeyHeader,
          },
          body: JSON.stringify(payload),
        });
    
        if (!response.ok) {
          const error = await response.json().catch(() => ({}));
          throw new Error(
            error.error || error.message || `API error: ${response.status}`
          );
        }
    
        const data = await response.json();
    
        if (!data.success) {
          throw new Error(data.error || 'Content generation failed');
        }
    
        return {
          ...data.data,
          usage: data.usage,
        };
      } catch (error) {
        throw new Error(error.message || 'Failed to generate Etsy SEO content');
      }
    }
  • Input schema for the tool defining required 'product_name' (string) and optional 'category' (string).
    inputSchema: {
      type: 'object',
      properties: {
        product_name: {
          type: 'string',
          description: 'Name of the product to optimize.',
        },
        category: {
          type: 'string',
          description: 'Optional category (e.g., "Home & Living")',
        },
      },
      required: ['product_name'],
    },
  • mcp-server.js:823-851 (registration)
    Registration of the tool in the MCP 'tools/list' RPC method response, including name, description, and input schema.
    } else if (request.method === 'tools/list') {
      const response = {
        jsonrpc: '2.0',
        id: request.id,
        result: {
          tools: [
            {
              name: 'generate_etsy_seo',
              description: 'Generate SEO-optimized Etsy product listings.',
              inputSchema: {
                type: 'object',
                properties: {
                  product_name: {
                    type: 'string',
                    description: 'Name of the product to optimize.',
                  },
                  category: {
                    type: 'string',
                    description: 'Optional category (e.g., "Home & Living")',
                  },
                },
                required: ['product_name'],
              },
            },
          ],
        },
      };
    
      console.log(JSON.stringify(response));
  • mcp-server.js:852-883 (registration)
    MCP 'tools/call' handler that checks the tool name 'generate_etsy_seo', invokes the handler, formats the result as rich text content with usage info, and responds.
    } else if (request.method === 'tools/call') {
      const { name, arguments: toolArgs } = request.params;
    
      if (name === 'generate_etsy_seo') {
        const result = await generateEtsySEO(
          toolArgs.product_name,
          toolArgs.category || ''
        );
    
        const usageInfo = result.usage
          ? `\n\n---\n**Usage:** ${result.usage.current}/${result.usage.limit} generations used (${result.usage.remaining} remaining)`
          : '';
    
        const response = {
          jsonrpc: '2.0',
          id: request.id,
          result: {
            content: [
              {
                type: 'text',
                text: `# Etsy SEO Results for "${toolArgs.product_name}"\n\n## πŸ“ SEO Title\n${result.title}\n\n## πŸ“„ Product Description\n${result.description}\n\n## 🏷️ Tags (15)\n${result.tags.join(
                  ', '
                )}\n\n## πŸ’° Suggested Price\n${
                  result.suggested_price_range
                }${usageInfo}`,
              },
            ],
          },
        };
    
        console.log(JSON.stringify(response));
      } else {
  • Helper function that generates the HMAC-SHA256 signature and timestamp for authenticating API requests using the API key secret.
    function generateSignature(payload) {
      const timestamp = Date.now().toString();
      const message = JSON.stringify(payload) + timestamp;
      const signature = crypto
        .createHmac('sha256', apiKeySecret || '')
        .update(message)
        .digest('hex');
      return { signature, timestamp };
    }
Install Server

Other Tools

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/semihbugrasezer/etsy-seo-mcp'

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