Skip to main content
Glama

asset_models_list

Read-onlyIdempotent

List over 60 image models from the registry with optional filters for free, paid, paste-only, RGBA, or SVG support. Get model IDs, families, providers, and tier info for prompt-to-asset workflows.

Instructions

List the model registry (60+ entries) with optional filters. MCP equivalent of p2a models list. Returns id, family, provider, dialect, native_rgba/svg flags, text ceiling, tier (free/paid/paste-only), key_set status. Filter flags: free, paid, paste_only, rgba, svg. Read-only; no network.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
freeNoOnly zero-key / free-tier models.
paidNoOnly paid direct-API models.
paste_onlyNoOnly paste-only surfaces (Midjourney, Firefly, Krea).
rgbaNoOnly models with native transparent-PNG output.
svgNoOnly models with native SVG output.

Implementation Reference

  • The actual handler function `modelsList` that executes the 'asset_models_list' tool logic. It filters MODEL_REGISTRY.models by optional flags (free, paid, paste_only, rgba, svg), enriches each entry with tier/status/key_set info, and returns the filtered list.
    export async function modelsList(input: ModelsListInputT): Promise<ModelsListResult> {
      const avail = detectApiAvailability();
      let models = MODEL_REGISTRY.models;
    
      if (input.free) models = models.filter((m) => m.free_tier);
      if (input.paid) models = models.filter((m) => !m.free_tier && !m.paste_only);
      if (input.paste_only) models = models.filter((m) => m.paste_only);
      if (input.rgba) models = models.filter((m) => m.native_rgba === true);
      if (input.svg) models = models.filter((m) => m.native_svg === true);
    
      const entries: ModelListEntry[] = models.map((m) => {
        const pkey = providerKeyForModel(m.id);
        const keySet = pkey ? avail[pkey] : false;
        const tier: ModelListEntry["tier"] = m.paste_only
          ? "paste-only"
          : m.free_tier
            ? "free"
            : "paid";
        const status: ModelListEntry["status"] = m.paste_only ? "paste" : keySet ? "ready" : "unset";
        const entry: ModelListEntry = {
          id: m.id,
          family: String(m.family),
          provider: m.provider,
          dialect: String(m.dialect),
          native_rgba: m.native_rgba,
          native_svg: m.native_svg,
          text_ceiling_chars: m.text_ceiling_chars,
          tier,
          status,
          provider_key_env: pkey ? envForKey(pkey) : null,
          key_set: keySet
        };
        if (m.aka?.length) entry.aka = m.aka;
        if (m.cost_hint) entry.cost_hint = m.cost_hint;
        return entry;
      });
    
      return {
        total: entries.length,
        filters_applied: {
          ...(input.free !== undefined && { free: input.free }),
          ...(input.paid !== undefined && { paid: input.paid }),
          ...(input.paste_only !== undefined && { paste_only: input.paste_only }),
          ...(input.rgba !== undefined && { rgba: input.rgba }),
          ...(input.svg !== undefined && { svg: input.svg })
        },
        models: entries
      };
    }
  • Zod schema `ModelsListInput` defining the input validation for the tool (free, paid, paste_only, rgba, svg as optional booleans).
    export const ModelsListInput = z.object({
      free: z.boolean().optional().describe("Only zero-key / free-tier models."),
      paid: z.boolean().optional().describe("Only paid direct-API models."),
      paste_only: z
        .boolean()
        .optional()
        .describe("Only paste-only surfaces (Midjourney, Firefly, Krea)."),
      rgba: z.boolean().optional().describe("Only models with native transparent-PNG output."),
      svg: z.boolean().optional().describe("Only models with native SVG output.")
    });
  • Type alias `ModelsListInputT` inferred from the Zod schema.
    export type ModelsListInputT = z.infer<typeof ModelsListInput>;
  • Tool registration entry in the tools array: defines name 'asset_models_list', description, input schema, and annotations (readOnlyHint, idempotentHint).
    {
      name: "asset_models_list",
      description:
        "List the model registry (60+ entries) with optional filters. MCP equivalent of `p2a models list`. Returns id, family, provider, dialect, native_rgba/svg flags, text ceiling, tier (free/paid/paste-only), key_set status. Filter flags: free, paid, paste_only, rgba, svg. Read-only; no network.",
      inputSchema: {
        type: "object",
        properties: {
          free: { type: "boolean", description: "Only zero-key / free-tier models." },
          paid: { type: "boolean", description: "Only paid direct-API models." },
          paste_only: {
            type: "boolean",
            description: "Only paste-only surfaces (Midjourney, Firefly, Krea)."
          },
          rgba: { type: "boolean", description: "Only models with native transparent-PNG output." },
          svg: { type: "boolean", description: "Only models with native SVG output." }
        },
        required: []
      },
      annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false }
    },
  • Handler dispatch in server.ts: case 'asset_models_list' calls modelsList(ModelsListInput.parse(args)).
    case "asset_models_list":
      result = await modelsList(ModelsListInput.parse(args ?? {}));
      break;
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint; description adds 'Read-only; no network' and lists return fields (id, family, provider, etc.) which provides additional behavioral context beyond annotations.

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?

Three concise sentences: first states purpose and size, second lists return fields, third lists filters. Front-loaded with purpose, no wasted words.

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

Completeness5/5

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

Given the simplicity of a filtered list tool with full schema coverage and annotations, the description is complete: it details return fields, filter options, and safety. No output schema needed; description covers return values.

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% and each parameter has a description. The description merely lists filter flags by name without adding new meaning or usage guidance beyond the schema.

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?

Description clearly states 'List the model registry' with size and optional filters, uses a specific verb and resource, and distinguishes from sibling 'asset_models_inspect' which likely inspects a single model. Also provides MCP equivalent command for context.

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

Usage Guidelines3/5

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

Description notes 'Read-only; no network' but does not explicitly state when to use this tool versus alternatives like other list or generation tools. No exclusions or when-not-to-use guidance provided.

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/MohamedAbdallah-14/prompt-to-asset'

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