Skip to main content
Glama
YonasValentin

Design Inspiration MCP Server

Search design styles

design_search_styles
Read-onlyIdempotent

Search for design inspiration by style, including color palettes, typography, layouts, or animation references. Combines image and web search results to provide visual references.

Instructions

Search for a specific aesthetic direction — color palettes, typography, layouts, or animation references. Runs image and web search in parallel and returns combined results.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
styleYesDesign style to search for. Examples: "minimalist dark theme", "brutalist web design", "glassmorphism"
typeNoType of style inspiration to search forgeneral
numNoNumber of results (1-20, default: 10)

Implementation Reference

  • The registration and handler implementation for the 'design_search_styles' tool, which performs parallel image and web searches using the Serper API based on the user's style and type preferences.
    server.registerTool("design_search_styles", {
      title: "Search design styles",
      description: `Search for a specific aesthetic direction — color palettes, typography, layouts, or animation references. Runs image and web search in parallel and returns combined results.`,
      inputSchema: SearchStyleInputSchema,
      annotations: {
        readOnlyHint: true,
        destructiveHint: false,
        idempotentHint: true,
        openWorldHint: true,
      },
    }, async (params: SearchStyleInput) => {
      try {
        const typeKeywords: Record<string, string> = {
          "color-palette": "color palette scheme",
          typography: "typography fonts",
          layout: "layout grid structure",
          animation: "animation motion design",
          general: "",
        };
    
        const query = `${params.style} ${typeKeywords[params.type]} UI design inspiration`;
        const allSites = Object.values(DESIGN_SITES);
        const siteFilter = allSites.map((s) => `site:${s}`).join(" OR ");
        const fullQuery = `${query} (${siteFilter})`;
    
        const [imageData, searchData] = await Promise.all([
          serperRequest<SerperImagesResponse>("/images", { q: fullQuery, num: params.num }),
          serperRequest<SerperSearchResponse>("/search", { q: fullQuery, num: params.num }),
        ]);
    
        const images = imageData.images || [];
        const results = searchData.organic || [];
    
        const lines = [`# Style Inspiration: "${params.style}" (${params.type})`, ""];
    
        if (images.length) {
          lines.push("## Images", "");
          for (const img of images.slice(0, 5)) {
            lines.push(`- **${img.title}**: ${img.imageUrl}`);
            lines.push(`  Source: ${img.source} | [View](${img.link})`);
          }
          lines.push("");
        }
    
        if (results.length) {
          lines.push("## References", "");
          for (const r of results) {
            lines.push(`- **${r.title}**`);
            lines.push(`  ${r.snippet}`);
            lines.push(`  [View](${r.link})`);
            lines.push("");
          }
        }
    
        let text = lines.join("\n");
        if (text.length > CHARACTER_LIMIT) {
          text = text.slice(0, CHARACTER_LIMIT) + "\n\n...(truncated)";
        }
    
        return {
          content: [{ type: "text" as const, text }],
          structuredContent: {
            style: params.style,
            type: params.type,
            images: images.slice(0, 5).map((img) => ({
              title: img.title,
              imageUrl: img.imageUrl,
              source: img.source,
              link: img.link,
            })),
            references: results.map((r) => ({
              title: r.title,
              link: r.link,
              snippet: r.snippet,
            })),
          },
        };
      } catch (error) {
        return {
          content: [
            {
              type: "text" as const,
              text: error instanceof Error ? error.message : `Error: ${String(error)}`,
            },
          ],
        };
      }
  • The Zod input schema definition for 'design_search_styles', validating style, type, and number of results.
        ),
      type: z
        .enum(["color-palette", "typography", "layout", "animation", "general"])
        .default("general")
        .describe("Type of style inspiration to search for"),
      num: z
        .number()
        .int()
        .min(1)
        .max(20)
        .default(10)
        .describe("Number of results (1-20, default: 10)"),
    })
    .strict();
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover key behavioral traits (read-only, open-world, idempotent, non-destructive). The description adds useful context about the tool's parallel search behavior ('Runs image and web search in parallel and returns combined results'), which is not captured in annotations. However, it does not disclose other behavioral aspects like rate limits, authentication needs, or result format details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded with the core purpose in the first sentence, followed by behavioral details. Every sentence earns its place by adding value without redundancy, making it efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, rich annotations, and 100% schema coverage, the description is mostly complete. It covers purpose and unique behavioral traits. However, without an output schema, it does not explain return values (e.g., result format or structure), leaving a minor gap in completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all parameters. The description does not add any additional meaning or semantics beyond what the schema provides (e.g., it doesn't explain parameter interactions or provide extra examples). Baseline score of 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verbs ('Search for a specific aesthetic direction') and resources ('color palettes, typography, layouts, or animation references'), and distinguishes it from siblings by mentioning it runs 'image and web search in parallel and returns combined results'—unlike design_search_images which likely only searches images.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool ('Search for a specific aesthetic direction'), but does not explicitly state when not to use it or name alternatives among the sibling tools (e.g., design_search_images for image-only searches). The implied usage is strong but lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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/YonasValentin/design-inspiration-mcp-server'

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