Generate images with any major model — one API key, one prepaid balance, one MCP.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
j_… id returned by generate_image / edit_image
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.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | j_… id returned by generate_image / edit_image |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"description": "j_… id returned by generate_image / edit_image"
}
}
}Edit a previously generated image by its img_… id with a natural-language instruction.
| Argument | Type | Description |
|---|---|---|
| image* | string | img_… id of a previous generation |
| model | string | |
| overlay | any | |
| resolution | string | Output tier; defaults to the source image's |
| instruction* | string | What to change |
| aspect_ratio | string | Omit to keep the source image's shape. If set, it is per-model — see list_models. |
{
"type": "object",
"required": [
"image",
"instruction"
],
"properties": {
"image": {
"type": "string",
"description": "img_… id of a previous generation"
},
"model": {
"type": "string",
"default": "nano-banana-2"
},
"overlay": {
"oneOf": [
{
"type": "string",
"const": "default",
"description": "Apply your saved brand kit (set with PUT /v1/brand-kit)"
},
{
"type": "object",
"properties": {
"font": {
"enum": [
"space-grotesk",
"inter",
"jetbrains-mono"
],
"type": "string",
"description": "text only; default space-grotesk"
},
"size": {
"enum": [
"s",
"m",
"l"
],
"type": "string",
"description": "text cap-height or logo width; default m"
},
"text": {
"type": "string",
"description": "Handle to render, ≤64 chars, single line (mutually exclusive with logo_id)"
},
"color": {
"type": "string",
"description": "text only; \"auto\" (default) or #RRGGBB"
},
"margin": {
"description": "\"safe\" (default) or a non-negative px number"
},
"weight": {
"enum": [
400,
500,
700
],
"type": "number",
"description": "text only; default 700"
},
"logo_id": {
"type": "string",
"description": "A logo uploaded via POST /v1/logos (mutually exclusive with text)"
},
"opacity": {
"type": "number",
"description": "0.2–1.0, default 0.9"
},
"position": {
"enum": [
"top-left",
"top-right",
"bottom-left",
"bottom-right"
],
"type": "string",
"description": "default bottom-right"
},
"logo_style": {
"enum": [
"sticker",
"shadow",
"outline",
"none"
],
"type": "string",
"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)."
}
},
"description": "Optional brand overlay composited into a corner after generation. Provide EITHER text OR logo_id (an uploaded brand logo), not both."
}
]
},
"resolution": {
"enum": [
"1K",
"2K",
"4K"
],
"type": "string",
"description": "Output tier; defaults to the source image's"
},
"instruction": {
"type": "string",
"description": "What to change"
},
"aspect_ratio": {
"type": "string",
"description": "Omit to keep the source image's shape. If set, it is per-model — see list_models."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| model | string | Model id from list_models |
| prompt* | string | What to draw |
| overlay | any | |
| resolution | string | Output tier (default 1K); supported tiers and prices per model are in list_models |
| aspect_ratio | string | 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. |
{
"type": "object",
"required": [
"prompt"
],
"properties": {
"model": {
"type": "string",
"default": "nano-banana-2",
"description": "Model id from list_models"
},
"prompt": {
"type": "string",
"description": "What to draw"
},
"overlay": {
"oneOf": [
{
"type": "string",
"const": "default",
"description": "Apply your saved brand kit (set with PUT /v1/brand-kit)"
},
{
"type": "object",
"properties": {
"font": {
"enum": [
"space-grotesk",
"inter",
"jetbrains-mono"
],
"type": "string",
"description": "text only; default space-grotesk"
},
"size": {
"enum": [
"s",
"m",
"l"
],
"type": "string",
"description": "text cap-height or logo width; default m"
},
"text": {
"type": "string",
"description": "Handle to render, ≤64 chars, single line (mutually exclusive with logo_id)"
},
"color": {
"type": "string",
"description": "text only; \"auto\" (default) or #RRGGBB"
},
"margin": {
"description": "\"safe\" (default) or a non-negative px number"
},
"weight": {
"enum": [
400,
500,
700
],
"type": "number",
"description": "text only; default 700"
},
"logo_id": {
"type": "string",
"description": "A logo uploaded via POST /v1/logos (mutually exclusive with text)"
},
"opacity": {
"type": "number",
"description": "0.2–1.0, default 0.9"
},
"position": {
"enum": [
"top-left",
"top-right",
"bottom-left",
"bottom-right"
],
"type": "string",
"description": "default bottom-right"
},
"logo_style": {
"enum": [
"sticker",
"shadow",
"outline",
"none"
],
"type": "string",
"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)."
}
},
"description": "Optional brand overlay composited into a corner after generation. Provide EITHER text OR logo_id (an uploaded brand logo), not both."
}
]
},
"resolution": {
"enum": [
"1K",
"2K",
"4K"
],
"type": "string",
"description": "Output tier (default 1K); supported tiers and prices per model are in list_models"
},
"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."
}
}
}Show the current prepaid balance in USD.
No arguments.
{
"type": "object",
"properties": {}
}List available image models with pricing and latency.
No arguments.
{
"type": "object",
"properties": {}
}List card templates with their slots, style axes and exact price.
No arguments.
{
"type": "object",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| size | string | default 16:9 |
| scale | number | device pixel ratio; 2 default, 3 costs $0.01 more |
| slots* | object | 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. |
| style | any | 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. |
| overlay | any | |
| template* | string | Template id from list_templates, e.g. "quote-card" |
{
"type": "object",
"required": [
"template",
"slots"
],
"properties": {
"size": {
"enum": [
"16:9",
"1:1",
"4:5",
"og"
],
"type": "string",
"description": "default 16:9"
},
"scale": {
"enum": [
1,
2,
3
],
"type": "number",
"description": "device pixel ratio; 2 default, 3 costs $0.01 more"
},
"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."
},
"style": {
"oneOf": [
{
"enum": [
"auto",
"brand"
],
"type": "string"
},
{
"type": "object",
"properties": {
"font": {
"type": "string"
},
"layout": {
"type": "string"
},
"shadow": {
"type": "boolean",
"description": "crisp offset shadow behind the type"
},
"palette": {
"type": "string"
}
}
}
],
"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."
},
"overlay": {
"oneOf": [
{
"type": "string",
"const": "default",
"description": "Apply your saved brand kit (set with PUT /v1/brand-kit)"
},
{
"type": "object",
"properties": {
"font": {
"enum": [
"space-grotesk",
"inter",
"jetbrains-mono"
],
"type": "string",
"description": "text only; default space-grotesk"
},
"size": {
"enum": [
"s",
"m",
"l"
],
"type": "string",
"description": "text cap-height or logo width; default m"
},
"text": {
"type": "string",
"description": "Handle to render, ≤64 chars, single line (mutually exclusive with logo_id)"
},
"color": {
"type": "string",
"description": "text only; \"auto\" (default) or #RRGGBB"
},
"margin": {
"description": "\"safe\" (default) or a non-negative px number"
},
"weight": {
"enum": [
400,
500,
700
],
"type": "number",
"description": "text only; default 700"
},
"logo_id": {
"type": "string",
"description": "A logo uploaded via POST /v1/logos (mutually exclusive with text)"
},
"opacity": {
"type": "number",
"description": "0.2–1.0, default 0.9"
},
"position": {
"enum": [
"top-left",
"top-right",
"bottom-left",
"bottom-right"
],
"type": "string",
"description": "default bottom-right"
},
"logo_style": {
"enum": [
"sticker",
"shadow",
"outline",
"none"
],
"type": "string",
"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)."
}
},
"description": "Optional brand overlay composited into a corner after generation. Provide EITHER text OR logo_id (an uploaded brand logo), not both."
}
]
},
"template": {
"type": "string",
"description": "Template id from list_templates, e.g. \"quote-card\""
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| data* | string | data URI or bare base64, e.g. "data:image/png;base64,…" |
| kind* | string | what the image is for; "avatar" for a card byline |
{
"type": "object",
"required": [
"data",
"kind"
],
"properties": {
"data": {
"type": "string",
"description": "data URI or bare base64, e.g. \"data:image/png;base64,…\""
},
"kind": {
"enum": [
"avatar",
"logo",
"photo",
"image"
],
"type": "string",
"description": "what the image is for; \"avatar\" for a card byline"
}
}
}