mcp

Generate images with any major model — one API key, one prepaid balance, one MCP.

Should I use this

Quality & Safety

A
Description quality
90%
Schema completeness
70%
Naming quality
98%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,344Tokens (tool definitions)
~2.8 KBTypical response size
Moderate attention impact (1.83% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "mcp": {
      "command": "npx",
      "args": [
        "@pixfaro/mcp"
      ]
    }
  }
}

Runnable packages

npm@pixfaro/mcp0.1.2stdio

Remote endpoints

https://mcp.pixfaro.com/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢generate_image(prompt, model, aspect_ratio, resolution, overlay)

Generate an image from a text prompt. Returns a hosted URL plus cost and balance. Slow models (mode "async" in list_models) return a j_… job id instead — poll it with check_job.

Input Schema

{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "description": "What to draw"
    },
    "model": {
      "type": "string",
      "description": "Model id from list_models",
      "default": "nano-banana-2"
    },
    "aspect_ratio": {
      "type": "string",
      "description": "e.g. \"16:9\" (default 1:1). Ratios are per-model — list_models names the ones verified for each. Gemini models take a fixed set (no 4:1 or wider); the budget fal models compute any bounded W:H, so use one of those for banner shapes — up to 4:1 / 1:4, beyond which the derived strip gets too thin to send. Every fal model is 1K-only, so that is the practical bound."
    },
    "resolution": {
      "type": "string",
      "enum": [
        "1K",
        "2K",
        "4K"
      ],
      "description": "Output tier (default 1K); supported tiers and prices per model are in list_models"
    },
    "overlay": {
      "oneOf": [
        {
          "type": "string",
          "const": "default",
          "description": "Apply your saved brand kit (set with PUT /v1/brand-kit)"
        },
        {
          "type": "object",
          "description": "Optional brand overlay composited into a corner after generation. Provide EITHER text OR logo_id (an uploaded brand logo), not both.",
          "properties": {
            "text": {
              "type": "string",
              "description": "Handle to render, ≤64 chars, single line (mutually exclusive with logo_id)"
            },
            "logo_id": {
              "type": "string",
              "description": "A logo uploaded via POST /v1/logos (mutually exclusive with text)"
            },
            "logo_style": {
              "type": "string",
              "enum": [
                "sticker",
                "shadow",
                "outline",
                "none"
              ],
              "description": "Logo treatment (logo_id only). RECOMMENDED default \"sticker\": crisp die-cut border + drop shadow, legible on any photo. \"shadow\": drop shadow only (use when the logo already contrasts the scene). \"outline\": border only, flat cut-out. \"none\": bare logo, its own alpha only (use only for a pre-processed logo on a controlled background)."
            },
            "position": {
              "type": "string",
              "enum": [
                "top-left",
                "top-right",
                "bottom-left",
                "bottom-right"
              ],
              "description": "default bottom-right"
            },
            "font": {
              "type": "string",
              "enum": [
                "space-grotesk",
                "inter",
                "jetbrains-mono"
              ],
              "description": "text only; default space-grotesk"
            },
            "weight": {
              "type": "number",
              "enum": [
                400,
                500,
                700
              ],
              "description": "text only; default 700"
            },
            "size": {
              "type": "string",
              "enum": [
                "s",
                "m",
                "l"
              ],
              "description": "text cap-height or logo width; default m"
            },
            "color": {
              "type": "string",
              "description": "text only; \"auto\" (default) or #RRGGBB"
            },
            "opacity": {
              "type": "number",
              "description": "0.2–1.0, default 0.9"
            },
            "margin": {
              "description": "\"safe\" (default) or a non-negative px number"
            }
          }
        }
      ]
    }
  },
  "required": [
    "prompt"
  ]
}
🟡edit_image(image, instruction, model, aspect_ratio, resolution, ...)

Edit a previously generated image by its img_… id with a natural-language instruction.

Input Schema

{
  "type": "object",
  "properties": {
    "image": {
      "type": "string",
      "description": "img_… id of a previous generation"
    },
    "instruction": {
      "type": "string",
      "description": "What to change"
    },
    "model": {
      "type": "string",
      "default": "nano-banana-2"
    },
    "aspect_ratio": {
      "type": "string",
      "description": "Omit to keep the source image's shape. If set, it is per-model — see list_models."
    },
    "resolution": {
      "type": "string",
      "enum": [
        "1K",
        "2K",
        "4K"
      ],
      "description": "Output tier; defaults to the source image's"
    },
    "overlay": {
      "oneOf": [
        {
          "type": "string",
          "const": "default",
          "description": "Apply your saved brand kit (set with PUT /v1/brand-kit)"
        },
        {
          "type": "object",
          "description": "Optional brand overlay composited into a corner after generation. Provide EITHER text OR logo_id (an uploaded brand logo), not both.",
          "properties": {
            "text": {
              "type": "string",
              "description": "Handle to render, ≤64 chars, single line (mutually exclusive with logo_id)"
            },
            "logo_id": {
              "type": "string",
              "description": "A logo uploaded via POST /v1/logos (mutually exclusive with text)"
            },
            "logo_style": {
              "type": "string",
              "enum": [
                "sticker",
                "shadow",
                "outline",
                "none"
              ],
              "description": "Logo treatment (logo_id only). RECOMMENDED default \"sticker\": crisp die-cut border + drop shadow, legible on any photo. \"shadow\": drop shadow only (use when the logo already contrasts the scene). \"outline\": border only, flat cut-out. \"none\": bare logo, its own alpha only (use only for a pre-processed logo on a controlled background)."
            },
            "position": {
              "type": "string",
              "enum": [
                "top-left",
                "top-right",
                "bottom-left",
                "bottom-right"
              ],
              "description": "default bottom-right"
            },
            "font": {
              "type": "string",
              "enum": [
                "space-grotesk",
                "inter",
                "jetbrains-mono"
              ],
              "description": "text only; default space-grotesk"
            },
            "weight": {
              "type": "number",
              "enum": [
                400,
                500,
                700
              ],
              "description": "text only; default 700"
            },
            "size": {
              "type": "string",
              "enum": [
                "s",
                "m",
                "l"
              ],
              "description": "text cap-height or logo width; default m"
            },
            "color": {
              "type": "string",
              "description": "text only; \"auto\" (default) or #RRGGBB"
            },
            "opacity": {
              "type": "number",
              "description": "0.2–1.0, default 0.9"
            },
            "margin": {
              "description": "\"safe\" (default) or a non-negative px number"
            }
          }
        }
      ]
    }
  },
  "required": [
    "image",
    "instruction"
  ]
}
🟡render_template(template, slots, size, style, scale, ...)

Render a typeset card from a template — a finished, on-brand social image (quote card, post card) in about two seconds. Cheaper and more legible than generating type with a model. Get the templates and their slots from list_templates.

Input Schema

{
  "type": "object",
  "properties": {
    "template": {
      "type": "string",
      "description": "Template id from list_templates, e.g. \"quote-card\""
    },
    "slots": {
      "type": "object",
      "description": "The template's slot values, e.g. { \"quote\": \"…\", \"handle\": \"@you\" }. Image slots take an asset id from upload_asset, or \"default\" for your brand kit."
    },
    "size": {
      "type": "string",
      "enum": [
        "16:9",
        "1:1",
        "4:5",
        "og"
      ],
      "description": "default 16:9"
    },
    "style": {
      "description": "Leave unset for the template default, \"auto\" for a random combination that avoids your last one, \"brand\" for your saved colours, or an object of style axes.",
      "oneOf": [
        {
          "type": "string",
          "enum": [
            "auto",
            "brand"
          ]
        },
        {
          "type": "object",
          "properties": {
            "palette": {
              "type": "string"
            },
            "font": {
              "type": "string"
            },
            "layout": {
              "type": "string"
            },
            "shadow": {
              "type": "boolean",
              "description": "crisp offset shadow behind the type"
            }
          }
        }
      ]
    },
    "scale": {
      "type": "number",
      "enum": [
        1,
        2,
        3
      ],
      "description": "device pixel ratio; 2 default, 3 costs $0.01 more"
    },
    "overlay": {
      "oneOf": [
        {
          "type": "string",
          "const": "default",
          "description": "Apply your saved brand kit (set with PUT /v1/brand-kit)"
        },
        {
          "type": "object",
          "description": "Optional brand overlay composited into a corner after generation. Provide EITHER text OR logo_id (an uploaded brand logo), not both.",
          "properties": {
            "text": {
              "type": "string",
              "description": "Handle to render, ≤64 chars, single line (mutually exclusive with logo_id)"
            },
            "logo_id": {
              "type": "string",
              "description": "A logo uploaded via POST /v1/logos (mutually exclusive with text)"
            },
            "logo_style": {
              "type": "string",
              "enum": [
                "sticker",
                "shadow",
                "outline",
                "none"
              ],
              "description": "Logo treatment (logo_id only). RECOMMENDED default \"sticker\": crisp die-cut border + drop shadow, legible on any photo. \"shadow\": drop shadow only (use when the logo already contrasts the scene). \"outline\": border only, flat cut-out. \"none\": bare logo, its own alpha only (use only for a pre-processed logo on a controlled background)."
            },
            "position": {
              "type": "string",
              "enum": [
                "top-left",
                "top-right",
                "bottom-left",
                "bottom-right"
              ],
              "description": "default bottom-right"
            },
            "font": {
              "type": "string",
              "enum": [
                "space-grotesk",
                "inter",
                "jetbrains-mono"
              ],
              "description": "text only; default space-grotesk"
            },
            "weight": {
              "type": "number",
              "enum": [
                400,
                500,
                700
              ],
              "description": "text only; default 700"
            },
            "size": {
              "type": "string",
              "enum": [
                "s",
                "m",
                "l"
              ],
              "description": "text cap-height or logo width; default m"
            },
            "color": {
              "type": "string",
              "description": "text only; \"auto\" (default) or #RRGGBB"
            },
            "opacity": {
              "type": "number",
              "description": "0.2–1.0, default 0.9"
            },
            "margin": {
              "description": "\"safe\" (default) or a non-negative px number"
            }
          }
        }
      ]
    }
  },
  "required": [
    "template",
    "slots"
  ]
}
🟡upload_asset(data, kind)

Upload an image (PNG or JPEG, ≤5 MB) as a reusable asset — an avatar for a card, for example. Returns an ast_… id to pass into a template slot.

Input Schema

{
  "type": "object",
  "properties": {
    "data": {
      "type": "string",
      "description": "data URI or bare base64, e.g. \"data:image/png;base64,…\""
    },
    "kind": {
      "type": "string",
      "enum": [
        "avatar",
        "logo",
        "photo",
        "image"
      ],
      "description": "what the image is for; \"avatar\" for a card byline"
    }
  },
  "required": [
    "data",
    "kind"
  ]
}
🟢list_models

List available image models with pricing and latency.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢list_templates

List card templates with their slots, style axes and exact price.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢get_balance

Show the current prepaid balance in USD.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢check_job(job_id)

Check an async generation job by its j_… id. Slow models (mode "async" in list_models) return a job instead of an image — poll this until it succeeds or fails.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "j_… id returned by generate_image / edit_image"
    }
  },
  "required": [
    "job_id"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded8 tools