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 };
    }

Tool Definition Quality

Score is being calculated. Check back soon.

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