Skip to main content
Glama

maginary-mcp

PyPI Python License: MIT

Model Context Protocol server for Maginary — enumerate the prompt-DSL flags the engine accepts, kick off generations, and poll for results, all from inside your MCP-compatible client (Claude Desktop, Cursor, Continue, custom).

why

Maginary uses a Midjourney-style --flag prompt DSL over an async HTTP API. This server:

  • surfaces the full parameter catalog to your LLM so it can pick the right flags

  • offers a one-shot generate tool that hits POST /api/gens/

  • offers get_generation + wait_for_generation for polling to a terminal state

  • works offline for the catalog tools (ships a bundled snapshot; refreshed from the live docs endpoint at startup when reachable)

Related MCP server: @retomagic/mcp

install

uvx maginary-mcp                   # ephemeral run via uv
# — or —
pip install maginary-mcp
maginary-mcp

Requires Python 3.10+.

configuration

Environment variables:

var

default

meaning

MAGINARY_API_KEY

Bearer token from app.maginary.ai/dashboard#api-keys. Required for generate / get_generation / wait_for_generation. Catalog tools work without it.

MAGINARY_BASE_URL

https://app.maginary.ai/api

Override for staging or self-hosted.

MAGINARY_PUBLIC_HOST

app.maginary.ai

Hosted mode only. Sent to the backend as X-Forwarded-Host (with -Proto/-For) when MAGINARY_BASE_URL is an internal address, so the backend builds public URLs.

MAGINARY_MCP_REQUIRE_AUTH

off

Hosted mode only. On: every /mcp call needs a Bearer (OAuth token or API key); without one the server answers 401 + WWW-Authenticate pointing at /.well-known/oauth-protected-resource, which is how Claude/ChatGPT start the login. Trade-off: a wallet-only agent has no Bearer to send, so with the gate on it must make its first x402 payment over plain HTTP (POST /api/gens/ returns an API key) and connect with that key; the 401 body says so.

MAGINARY_OAUTH_ISSUER

https://app.maginary.ai/o

The authorization server named in the protected-resource metadata (the backend, django-oauth-toolkit).

MAGINARY_MCP_RESOURCE_URL

https://mcp.maginary.ai/mcp

This server's canonical resource identifier (RFC 8707 audience).

MAGINARY_MCP_LOG_LEVEL

INFO

Standard Python log level; goes to stderr (stdout is reserved for MCP JSON-RPC).

Claude Desktop config

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or the equivalent on your OS:

{
  "mcpServers": {
    "maginary": {
      "command": "uvx",
      "args": ["maginary-mcp"],
      "env": {
        "MAGINARY_API_KEY": "sk-mag-…"
      }
    }
  }
}

hosted (no-install) — Streamable HTTP

Connect a client straight to the hosted server at https://mcp.maginary.ai/mcp. Zero install — the server is multi-tenant, so each request is scoped to whatever credential it arrives with. Two ways to authenticate, pick whichever fits the client:

Connect (OAuth) — for Claude Desktop, claude.ai, and any other client that speaks MCP's OAuth spec. Add the server with no headers at all:

{
  "mcpServers": {
    "maginary": { "url": "https://mcp.maginary.ai/mcp" }
  }
}

Click "Connect" in the client. It opens a login page on app.maginary.ai, you sign in and approve the requested scopes, and the client holds the token from then on — no key to generate or paste. Requires the server to be running with MAGINARY_MCP_REQUIRE_AUTH=1; without it, no login is asked for at all.

API key — for any client that doesn't do the OAuth dance (or if you'd rather not click through a login), generate a key at app.maginary.ai/dashboard#api-keys and send it yourself:

{
  "mcpServers": {
    "maginary": {
      "url": "https://mcp.maginary.ai/mcp",
      "headers": { "Authorization": "Bearer sk-mag-…" }
    }
  }
}

Both are equivalent once connected — same tools, same account. Catalog tools work with no credential either way; generate / get_generation / wait_for_generation need one. Run the hosted server yourself with:

paying inside the tool call (x402 over MCP)

No key at all? Call generate anyway. Out of credits (or no account), the result is isError: true with the x402 PaymentRequired at the top level (accepts, resource, …) plus error: "payment_required". An x402-capable MCP client — the x402 SDK's x402MCPSession — signs accepts[0] and calls the same tool again with the payment in _meta["x402/payment"]. The server forwards it to the backend as PAYMENT-SIGNATURE; the backend verifies, settles on Base and, for a wallet with no account, creates one. The settled result carries the on-chain receipt in _meta["x402/payment-response"] and x402_receipt, and a first settlement returns x402_account: {api_key, wallet}. Pass that key as _meta["maginary/api_key"] on later calls (polling needs it), or open a new connection with it as the Bearer header. The server holds no payment logic; everything is decided by the backend's /api/gens/ contract.

lost the key? recover it, no new payment

A key returned by x402_account is shown exactly once. If it's gone — the agent never persisted it, or a human never wrote it down — paying again from the same wallet does not hand back a second one: repeat payments just add credits to the account. That's deliberate (an unbounded stream of fresh keys from routine top-ups would be a bigger secret-exposure surface than losing one, and would remove any reason to persist a key at all), so recovery is a separate, explicit step: prove you hold the private key by signing a short message, and the backend reissues a key.

POST https://app.maginary.ai/api/auth/x402/recover-key/
{
  "address": "0xYourWalletAddress",
  "timestamp": 1741000000,
  "signature": "0x..."
}

signature is a standard personal_sign (EIP-191 — the same call MetaMask, ethers' signer.signMessage(str), or eth_account's Account.sign_message already expose) over the literal string:

Maginary: issue a new API key for <address> at <timestamp>. This does not move funds.

with <address> lowercased and <timestamp> the same unix seconds sent in the body. The timestamp must be within 5 minutes of the server's clock (30 s of future skew tolerated) — it's the only replay defense, so a stale or reused signature is rejected the same as a wrong one. A 200 revokes every existing key on the account and returns exactly one fresh one, in the body and in X-Maginary-Api-Key — same shape as x402_account, so code that already handles the first-payment response handles this response too.

This is a plain backend REST call, not an MCP tool — deliberately, for the same reason the payment logic itself lives in the backend and not here: the server holds no identity logic of its own, and any agent that can already construct and sign the x402 payment above can construct and sign this one the same way. The one place this needs to be discoverable from inside an MCP session is the 402 itself: an anonymous generate call always comes back payment_required before the backend has any idea which wallet is asking, so its error text always names this endpoint alongside the payment instructions — an agent that gets stuck here learns about it from the exact same message it already parses to learn about paying in the first place, no separate discovery step.

pip install "maginary-mcp[http]"
maginary-mcp-http          # serves /mcp on 0.0.0.0:8642 (MAGINARY_MCP_PORT to change)
# — or —
docker build -t maginary-mcp . && docker run -p 8642:8642 maginary-mcp

The hosted server sets no MAGINARY_API_KEY (keys come per-request). Extra env: MAGINARY_MCP_HOST (default 0.0.0.0), MAGINARY_MCP_PORT (default 8642).

Claude Skill

The server ships an Agent Skill that teaches the --flag DSL, model selection, and the async generate→poll flow:

maginary-mcp --install-skill   # -> ~/.claude/skills/maginary-image-gen/SKILL.md

The skill stands on its own — hosts without MCP get the DSL plus the raw REST calls (POST /gens/ → poll). With the server connected, Claude instead calls search_parameters for the authoritative flag list and generate/wait_for_generation natively. Re-running updates it; local edits are protected unless you pass --force. Source: src/maginary_mcp/SKILL.md.

tools

catalog (no auth)

  • list_parameters(category?, status?, include_reserved=false) — enumerate the catalog

  • search_parameters(query, category?, include_reserved=false) — text search over names / aliases / desc / examples

  • get_parameter(name) — full record for one flag (canonical name or alias)

list_parameters responses include the categories / statuses taxonomy, and both list/search responses carry source (live vs bundled-snapshot).

generation (auth required)

  • generate(prompt, callback_url?)POST /api/gens/

  • get_generation(uuid)GET /api/gens/{uuid}/

  • wait_for_generation(uuid, timeout_s=45) — poll to done / failed; a timeout result means still running — call again

worked example

Inside an MCP-capable client, once configured:

"Search the maginary catalog for anything about aspect ratio."

The LLM calls search_parameters("aspect") and gets back the --ar entry with values, examples, and supported models.

"Now generate a cinematic portrait 16:9 with the flagship model."

The LLM calls generate("a cinematic portrait --ar 16:9 --flagship"), gets a uuid, then wait_for_generation(uuid) and reads image_urls[] out of the terminal record.

catalog freshness

  • Live fetch on startup from https://maginary.ai/docs/parameters.json, 5-second timeout.

  • Bundled snapshot at src/maginary_mcp/parameters_snapshot.json used as a fallback whenever live fetch fails (no network, docs site down, etc.).

  • The snapshot is refreshed manually by the maintainer via python scripts/refresh_snapshot.py — deliberately not baked into the wheel build so a new snapshot always corresponds to a reviewed commit.

The source field on list_parameters / search_parameters responses tells you which one is active.

development

cd mcp
python -m venv venv && source venv/bin/activate
pip install -e .
maginary-mcp   # runs on stdio; kill with Ctrl+D

license

MIT.

Available Tools

13 tools
check_account_statusA

Check account verification status, credit balance, and API key count.

Use this after ``create_account`` to poll whether the user has clicked the
verification link. Pass ``email`` + ``password`` (from ``create_account``)
for Basic auth, or omit both to use the configured API key.

Args:
    email: Account email (for Basic auth).
    password: Account password (for Basic auth).

Returns:
    Dict with ``verified`` (bool), ``email``, ``api_key_count``,
    ``credits_remaining``, ``uploads_remaining``.
ParametersJSON Schema
NameRequiredDescriptionDefault
emailNo
passwordNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations present, the description carries the full burden, and it reveals key behavioral details: it is a read-only status check, accepts optional Basic auth credentials, and returns a structured dict with verified, email, api_key_count, credits_remaining, uploads_remaining. It does not mention potential errors or rate limits, but for this tool the core behavior is well disclosed.

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 compact and front-loaded: purpose sentence, usage context, concise Args, and Returns. There is no filler or repetition of schema information.

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?

For a two-parameter status-check tool with an output schema, the description covers when to invoke it, how to authenticate in both modes, parameters, and return fields. Nothing essential is missing for correct invocation.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate; it does by defining email and password as Basic auth credentials obtained from create_account, and by stating that omitting both falls back to the configured API key. This adds meaning well beyond the bare schema field names.

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 opens with a specific verb ('Check') and a concrete resource (account verification status, credit balance, API key count). It clearly differentiates this from sibling tools like get_balance or create_account by covering a distinct account-status read.

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?

Explicitly instructs to use after create_account to poll verification-link clicks, and explains the two auth modes (Basic auth with email/password vs omitting both for API key). It does not list when-not-to-use cases or alternatives, but the provided context is sufficient for typical selection.

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

checkoutA

Create a Stripe checkout session for purchasing a product.

Returns a ``checkout_url`` — the user must open it in a browser to
complete payment. After payment, credits are provisioned automatically
via webhook.

If the agent has a USDC wallet, skip this entirely — just call
``generate`` and the x402 protocol handles payment on-chain.

Args:
    product_id: Product ID from ``get_products``.
    email: Account email (for Basic auth during onboarding).
    password: Account password (for Basic auth during onboarding).

Returns:
    Dict with ``checkout_url``. On failure, an ``isError`` result — e.g.
    ``error: "email_not_verified"`` until the user clicks the
    verification link, or ``"auth"`` / ``"failed"``.
ParametersJSON Schema
NameRequiredDescriptionDefault
emailNo
passwordNo
product_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries full behavioral weight and succeeds: it discloses that the tool returns a `checkout_url` the user must open, that credits are provisioned automatically via webhook, and that failures return `email_not_verified`, `auth`, or `failed` errors. This gives the agent accurate expectations about side effects and outcomes beyond any schema information.

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 well-structured and front-loaded: it opens with the core purpose, then covers the URL flow, the alternative routing, arguments, and return/error behavior. Every section contributes necessary decision-making information without filler.

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?

For a checkout tool with an output schema and no annotations, the description covers the full call cycle: inputs, user action required, automatic credit provisioning, and failure modes. The agent has enough context to decide whether to use this tool and what to expect when invoking it.

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

Parameters4/5

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

Schema description coverage is 0%, so parameter explanations in the description are essential. All three parameters are addressed: `product_id` is sourced from `get_products`, and `email`/`password` are tied to Basic auth during onboarding. However, the description doesn't fully clarify when `email` and `password` are needed or what specific auth failures they prevent, so it is helpful but not exhaustive.

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 states a specific verb and resource: 'Create a Stripe checkout session for purchasing a product.' It also distinguishes itself from the sibling `generate` tool by explaining that on-chain payment should use `generate` instead, which makes the tool's role unambiguous.

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

Usage Guidelines5/5

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

The description explicitly tells the agent when to skip this tool: 'If the agent has a USDC wallet, skip this entirely — just call `generate`.' It also instructs that `product_id` comes from `get_products`, giving a clear dependency between sibling tools. This is strong when-to-use vs alternative guidance.

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

configure_api_keyA

Activate an API key. Local (stdio) servers persist it; hosted does not.

Call this after ``manage_api_key(action='create')`` returns a ``raw_key``.
On a local server the key is saved to ``~/.config/maginary/api_key``
(chmod 600) and survives restarts. On the hosted server
(mcp.maginary.ai) nothing can be stored — auth is per-request: the
response will say ``persisted: false`` and the key must be sent as an
``Authorization: Bearer <key>`` header on every request (set it in the
MCP client's connection config).

Args:
    api_key: The full API key string returned by ``manage_api_key``.

Returns:
    Confirmation dict.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations present, the description carries the full behavioral disclosure burden and succeeds: it details the local-server persistence path (~/.config/maginary/api_key, chmod 600, survives restarts), the hosted-server non-persistence behavior (persisted: false, per-request Authorization: Bearer header), and the confirmation response shape. This is rich, actionable behavioral context.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and ordering in the first two sentences, and the local/hosted distinction is logically grouped. It is slightly verbose with the Args/Returns block, but every sentence delivers necessary operational information, so the length is justified.

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 environment-dependent complexity (local vs hosted persistence), the description is complete: it covers ordering, input provenance, file paths, permissions, restart behavior, per-request auth headers, and the persisted:false response flag. An output schema exists to document the return value, so return-detail omission is acceptable.

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

Parameters5/5

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

Schema coverage is 0% — the schema only labels api_key as a required string. The description compensates fully by specifying the exact provenance: 'The full API key string returned by manage_api_key.' An agent knows precisely what value to pass and where to obtain it, which is the critical semantic the schema fails to convey.

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 opens with a specific verb+resource pair ('Activate an API key') and clearly distinguishes itself from the sibling manage_api_key by framing this tool as the activation step that follows key creation. The sequencing reference ('Call this after manage_api_key(action='create') returns a raw_key') makes the tool's role unambiguous.

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?

Explicit when-to-use guidance is provided: call this after manage_api_key(action='create') returns a raw_key. It also names the prerequisite sibling tool and explains environment-specific setup requirements. However, it does not state when-not to use it or enumerate alternative tools besides the implicit manage_api_key reference.

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

create_accountA

Create a new Maginary account for the given email address.

Returns the auto-generated password — display it to the user ONCE so they
can save it. A verification email is sent; the user must click the link
before the account can generate images.

After verification, use ``manage_api_key(action='create')`` with
``email`` + ``password`` to get an API key, then ``configure_api_key``
to activate it.

Args:
    email: The user's email address.

Returns:
    Dict with ``email``, ``password``, and ``message``. On failure, an
    ``isError`` result — e.g. ``error: "already_exists"`` (email taken:
    ask the user for their password or a different email),
    ``"rate_limited"``, or ``"failed"``.
ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

No annotations are present, so the description carries full responsibility for behavioral disclosure. It reveals that the password is auto-generated and displayed only once, that verification is required before account activation, and that failures return isError results with specific error meanings such as already_exists, rate_limited, and failed.

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 well-structured and front-loaded: action, immediate output warning, verification prerequisite, follow-up API steps, then error handling. Every sentence contributes necessary operational information with no filler.

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?

The description fully covers the account creation flow, including the one-time password display, verification requirement, subsequent API key steps, and detailed failure modes. This is sufficient for an agent to invoke the tool correctly and know what to expect at each step.

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?

The only parameter, email, is described as 'The user's email address,' which does not add significant meaning beyond the input schema's title. Since schema description coverage is 0%, this minimal description is acceptable but does not enrich the parameter with format, validation, or behavioral constraints.

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?

States a specific verb and resource: create a new Maginary account for an email address. It clearly differentiates itself from sibling tools like check_account_status, manage_api_key, and configure_api_key by defining its role as the account-creation entry point.

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

Usage Guidelines5/5

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

Provides explicit workflow guidance: show the returned password once, require email verification before image generation, then use manage_api_key(action='create') followed by configure_api_key. It also tells the agent how to handle the 'already_exists' failure by asking the user for their password or a different email.

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

generateA

Kick off a generation via POST /api/gens/.

Args:
    prompt: The full prompt string, including any ``--flag`` parameters.
        E.g. ``"a fox in autumn foliage --ar 16:9 --flagship"``.
        Flags go at the END of the prompt. The ones people need most:
        ``--1`` / ``--2`` / ``--3`` / ``--4`` = how many images (default 4;
        ``--1`` for a single image, cheapest), ``--ar 16:9`` = aspect ratio,
        ``--v <model>`` = model. Anything else: call ``get_parameter(name)``
        or ``search_parameters`` first — never guess a flag.
    callback_url: Optional HTTPS URL that will receive a webhook when the
        generation reaches done / failed. See
        https://maginary.ai/blog/webhooks-guide for signature verification.

Returns:
    On success, the created generation record. Key fields: ``uuid`` (use
    to poll), ``action_type``, ``processing_state``,
    ``expected_output_count``.

    On failure, an ``isError`` result instead (nothing is raised), with a
    JSON body whose ``error`` field is one of:

    - ``"auth"`` — no/invalid API key. Surface the message directly to
      the human.
    - ``"payment_required"`` — out of credits. The body carries
      ``billing_url`` and ``challenge``: either send the human to
      ``billing_url`` to top up, or pay programmatically via x402 —
      ``challenge`` is the standard x402 payment-required payload (USDC
      on Base); settle it and retry this call.
    - ``"failed"`` — anything else (invalid prompt, rate limit, backend
      or network error); see ``message``.

    x402 over MCP: a ``payment_required`` result also carries the x402
    fields at the top level (``accepts``, ``resource``); an x402-capable
    client signs ``accepts[0]`` and calls this tool again with the payment
    in ``_meta["x402/payment"]``. The settled call returns the generation
    with ``x402_receipt`` (and ``_meta["x402/payment-response"]``); a
    wallet's first settlement also returns ``x402_account`` with an API
    key — pass it as ``_meta["maginary/api_key"]`` on later calls (or as
    the Authorization header of a new connection).

Every flag that exists, and its state: Flags, live (35): --ar, --output-count (--1/--2/--3/--4), --seed, --transparent, --sref, --sw, --png, --jpg, --webp, --svg, --2k, --4k, --upscale, --vary, --varysubtle, --varystrong, --panleft, --panright, --panup, --pandown, --zoomout, --mp4, --video-resolution (--480p/--540p/--720p/--1024p/--1080p/--2160p / --4k (4k, Seedance 2 Pro)/--480p24 / --480p24fps/--540p24 / --540p24fps/--720p24 / --720p24fps/--1024p30 / --1024p30fps/--1080p24 / --1080p24fps), --video-fps (--24fps/--30fps/--50fps/--60fps), --video-duration (--4s / --4sec/--5s / --5sec/--6s / --6sec/--8s / --8sec/--10s / --10sec/--12s / --12sec), --flagship, --sora, --soralite, --nanobananapro, --nb2, --gpt2, --gpt2high, --seedance2, --seedance2pro, --demo. Partial (4, only some models honour them): --no, --zoomout2x, --zoomoutexpand, --zoomoutexpand2x. Reserved (2, the parser rejects them): --cref, --cw. Any other --flag is rejected with Unrecognized parameter. Details: get_parameter(name).

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYes
callback_urlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description fully carries the behavioral burden and does so thoroughly: it discloses async completion (uuid to poll), no-exception error style (isError result, nothing raised), auth/payment failure modes, webhook signing, and the x402 settlement flow. No behavioral surprises are hidden.

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

Conciseness3/5

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

The content is front-loaded and labeled clearly (Args/Returns/errors/x402), but the description is extremely long, largely due to an exhaustive 35-flag enumeration that partly duplicates the get_parameter/search_parameters tools. It earns its detail for safety, but is not appropriately sized and could be tightened by delegating the full list.

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?

For a mutable, two-parameter generation tool with no annotations, the description provides a complete operating manual: return fields, all error branches, billing and payment handling, x402 integration, flag constraints, and callback behavior. Nothing needed to invoke it correctly is missing.

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

Parameters5/5

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

Schema coverage is 0%, and the description compensates completely: prompt format, flag placement, examples, common flags, and the lookup rule for unknown flags are all covered; callback_url gets a definition, HTTPS requirement, and webhook documentation link. Every parameter acquires meaning beyond its bare schema type.

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 opens with a specific action and resource ('Kick off a generation via POST /api/gens/') and makes clear this creates a generation rather than inspecting one. The return contract (uuid for polling) further distinguishes it from sibling tools like get_generation and wait_for_generation.

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?

It provides strong usage context: prompts carry flags, flags go at the end, unknown flags must be looked up via get_parameter/search_parameters first, and callback_url is optional for webhook notifications. It stops short of explicitly naming when-not-to-use alternatives, such as 'use get_generation or wait_for_generation instead of calling generate again to check status,' so it doesn't reach a 5.

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

get_balanceA

Check remaining credits and uploads for the authenticated account.

Args:
    email: Account email (for Basic auth).
    password: Account password (for Basic auth).

Returns:
    Dict with ``credits_remaining`` and ``uploads_remaining``.
ParametersJSON Schema
NameRequiredDescriptionDefault
emailNo
passwordNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It identifies the operation as a read-only balance check, specifies that credentials use Basic auth, and names the exact return fields, giving the agent a clear picture of expected behavior.

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 brief and well organized with Args and Returns sections. Every sentence contributes necessary information, and there is no repetition of the input schema.

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?

For a simple read-only balance tool, the description is largely complete: purpose, auth context, and return keys are all covered. The only notable gap is the lack of guidance around optional credentials and behavior when authentication is absent.

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 coverage is 0%, so the description must add meaning. It does explain that both email and password are for Basic auth, but it does not address why they are optional, what happens if omitted, or how to obtain/format them.

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 states a specific verb 'Check' and a precise resource: remaining credits and uploads for the authenticated account. This clearly distinguishes it from siblings such as check_account_status, generate, or get_generation.

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

Usage Guidelines2/5

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

The description explains what the tool does but provides no guidance on when to use it versus alternatives, nor any exclusions. With siblings like check_account_status, an explicit usage note would help disambiguate.

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

get_generationA

Fetch a generation by UUID (GET /api/gens/{uuid}/).

Args:
    uuid: The UUID returned by ``generate``.

Returns:
    The full generation record. If terminal, ``image_urls[]`` holds the
    finished outputs and ``processing_result.slots[]`` the per-slot detail.
    NOTE: a generation that failed server-side is a SUCCESSFUL tool call
    returning ``processing_state: "failed"`` — always check the state,
    never infer success from the absence of a tool error.
    Hosted: a key obtained mid-session may be passed as
    ``_meta["maginary/api_key"]``.
ParametersJSON Schema
NameRequiredDescriptionDefault
uuidYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the behavioral disclosure burden. It excellently does so by explaining terminal vs. non-terminal states, the structure of image_urls and processing_result.slots, and the critical edge case that a server-side failure returns a successful tool call with processing_state: 'failed'. It also documents an optional hosted API key meta parameter.

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 well-structured with clear sections (Fetch, Args, Returns, NOTE, Hosted) and every sentence adds value. It front-loads the core purpose and endpoint, then provides necessary behavioral caveats without padding.

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?

The tool is simple (one parameter, no nesting), and while an output schema exists, the description still enriches understanding of return semantics and failure modes. It covers parameter origin, expected result shape, critical state-checking guidance, and auth metadata—everything an agent needs to invoke this tool correctly in context.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It does by explaining that uuid is 'The UUID returned by generate', giving the agent the provenance and expected value of the only parameter. It also mentions the optional _meta key for hosted sessions, adding useful context beyond the bare schema type.

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 starts with a specific verb and resource: 'Fetch a generation by UUID' and even includes the exact API endpoint. This clearly distinguishes it from siblings like 'generate' (which creates) and 'wait_for_generation' (which waits), and the UUID-based scope makes its role unambiguous.

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 by explaining that the uuid comes from the 'generate' call, which tells the agent when to use this tool. It also advises checking processing_state rather than assuming success. However, it does not explicitly name alternatives or state when not to use this tool vs. siblings like wait_for_generation.

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

get_parameterA

Return the full record for a single parameter (canonical name or alias).

Args:
    name: Parameter name with or without leading ``--`` (e.g. ``ar``,
        ``--ar``, ``aspect``). Case-insensitive.

Returns:
    The parameter dict. Not-found is an ``isError`` result — surface it
    rather than fabricating a param.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It discloses the return type ('parameter dict') and the error behavior (not-found is an 'isError' result, to be surfaced rather than fabricated), which is useful and goes beyond the schema. It doesn't mention auth, rate limits, or explicitly state read-only behavior, but for a simple getter the key behaviors are covered.

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 compact and well-structured with an opening purpose sentence followed by Args and Returns sections. Every sentence adds needed information, with no filler or repetition.

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?

For a single-parameter lookup with a single required argument and an output schema present, the description covers input semantics, return value, and not-found handling. It could optionally note when to prefer list_parameters or search_parameters, but this is a minor gap rather than a missing essential detail.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully explain the parameter, and it does. It explains that 'name' accepts canonical names or aliases, with or without leading '--', is case-insensitive, and provides concrete examples. This is stronger than typical schema text.

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

Purpose4/5

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

The description clearly states the action ('Return the full record') and the resource ('a single parameter'), and it narrows the scope by mentioning canonical names and aliases. It implicitly differentiates from list_parameters and search_parameters as a direct single-record lookup, though it doesn't explicitly name those alternatives.

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

Usage Guidelines2/5

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

There is no explicit guidance about when to use this tool versus list_parameters or search_parameters. The phrase 'single parameter' weakly implies direct lookup by name, but no conditions, exclusions, or alternative tool mentions are provided.

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

get_productsA

List available Maginary products/plans with pricing.

No authentication required. Use this to present purchase options to the
user. The ``novice_pack`` ($10, 150 credits) is the recommended starting
point.

Returns:
    Dict with ``count`` and ``products`` — each product carries ``id``,
    ``short_name``, ``title``, ``description``, ``price_cents``,
    ``credits``, ``uploads``, ``is_subscription``. (The backend sends a
    bare array; it is wrapped here because FastMCP validates tool output
    against the dict annotation and rejects a top-level list.)
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and handles it well. It discloses that no authentication is needed, describes the exact return shape including the wrapped dict versus bare backend array, and explains the FastMCP validation motivation. This is exemplary behavioral context.

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 concise and well-structured, front-loading the core purpose and pricing context before the return format. The return-format note is technical but earns its place because the wrapping behavior is non-obvious and important for callers.

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 zero parameters and an output schema, the description is complete: it explains purpose, authentication, purchase-context usage, recommended product, and the exact return contract. Nothing needed for correct invocation is missing.

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

Parameters4/5

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

The tool has zero parameters, so there is no parameter semantics burden for the description to carry. The description appropriately focuses on output and usage rather than parameter details.

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 verb and resource: 'List available Maginary products/plans with pricing.' It also distinguishes its purpose from the sibling tools by framing it as the way to present purchase options, which no sibling tool covers.

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 explicitly says when to use the tool ('Use this to present purchase options to the user') and notes that no authentication is required. It does not name exclusions or alternatives, but given the sibling set, the intended use is clear and unambiguous.

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

list_parametersA

List Maginary prompt-DSL parameters.

Args:
    category: Restrict to one category (e.g. ``composition``, ``video``,
        ``model``, ``outpaint``). Call with no filters once — the response's
        ``categories`` / ``statuses`` maps are the full taxonomy.
    status: Restrict to one status (``live``, ``mostly-dead``,
        ``unimplemented``).
    include_reserved: When False (default) drop ``unimplemented``
        (recognized-but-blocked) parameters from the result.

Returns:
    A dict with ``count``, ``source`` (``live`` vs. ``bundled-snapshot``),
    ``categories`` / ``statuses`` (the filter taxonomy), and ``parameters``
    (the array of matching entries).
ParametersJSON Schema
NameRequiredDescriptionDefault
statusNo
categoryNo
include_reservedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It covers filtering behavior, the effect of include_reserved, the response structure, and the important live vs. bundled-snapshot source distinction. It does not mention auth requirements or rate limits, but these are not implied by the tool's read-only listing nature.

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

Conciseness4/5

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

The description is well-structured with Args and Returns sections, front-loads the purpose, and avoids filler. It is slightly repetitive around the 'unimplemented' status concept across status and include_reserved, but remains efficient.

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?

For a listing tool with no required parameters and an output schema available, the description covers the key call patterns, filter semantics, and return keys. It does not discuss pagination or entry-level details of the parameters array, but the output schema likely covers those, and the description provides enough to invoke the tool correctly.

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

Parameters5/5

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

Schema coverage is 0%, so the description must fully explain the parameters. It does: category gives concrete examples and points to the taxonomy response, status lists allowed values, and include_reserved clarifies the default behavior with 'unimplemented' parameters. All three parameters receive meaningful, usable semantics.

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

Purpose4/5

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

The description states a specific verb and resource: 'List Maginary prompt-DSL parameters.' It clearly conveys the tool's core function, though it does not explicitly differentiate itself from sibling tools like search_parameters or get_parameter.

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 gives clear usage context for each filter and explicitly advises calling with no filters once to get the full taxonomy. It does not, however, state when to prefer this tool over alternatives such as search_parameters.

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

manage_api_keyA

Create, list, or revoke Maginary API keys (up to 10 per account).

Auth: pass ``email`` + ``password`` for Basic auth (onboarding), or omit
both to use the configured API key (normal operation).

Args:
    action: One of ``create``, ``list``, ``revoke``.
    name: Key name (required for ``create``).
    key_prefix: 8-char prefix of the key to revoke (required for ``revoke``).
    email: Account email (for Basic auth).
    password: Account password (for Basic auth).

Returns:
    For ``create``: dict with ``raw_key`` (the full key — show once, then
    use ``configure_api_key`` to activate it), ``key_prefix``, ``name``.
    For ``list``: dict with ``keys`` array.
    For ``revoke``: success/error message.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
emailNo
actionYes
passwordNo
key_prefixNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so thoroughly. It discloses the 10-key limit, the two auth modes, per-action behavior, and the show-once nature of raw_key. This goes well beyond what the schema alone communicates.

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 well-structured with a summary line followed by Auth, Args, and Returns sections. It is long only because it covers three actions and two auth modes, and every line earns its place.

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 no annotations and zero schema coverage, the description explains auth, conditionally required parameters, and return shapes for each action. The pointer to configure_api_key completes the workflow context. Nothing necessary for correct invocation is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate completely. It does: action is defined as create/list/revoke, name as required for create, key_prefix as required for revoke, and email/password as tied to Basic auth. Every parameter receives operational meaning.

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?

States three explicit verbs (create, list, revoke) targeting a single resource, Maginary API keys, and adds the 10-per-account limit. This clearly distinguishes it from sibling configure_api_key, which the description names as the activation step.

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?

Provides explicit auth-mode guidance: Basic auth with email/password for onboarding, or the configured API key for normal operation. It also names configure_api_key as the follow-up after create, but it does not explicitly exclude related siblings such as create_account.

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

search_parametersA

Text-search over parameter names, aliases, descriptions, values, examples.

Args:
    query: Substring match, case-insensitive.
    category: Optional single-category restriction.
    include_reserved: Whether to include ``unimplemented`` parameters.

Returns:
    Dict with ``count``, ``source`` (``live`` vs. ``bundled-snapshot``),
    and ``parameters`` (ordered as they appear in the catalog).
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
categoryNo
include_reservedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and does well: it discloses that search is case-insensitive substring matching, that include_reserved pulls in 'unimplemented' parameters, and that results are ordered as they appear in the catalog. It also reveals the live vs. bundled-snapshot source distinction. It could go further by explaining what 'unimplemented' means or how source is chosen, but coverage is strong.

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 tightly structured with Args and Returns sections, front-loads the core purpose in one sentence, and contains no filler. Every line adds useful information for calling the tool correctly.

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?

For a read-only search tool with three parameters and an output schema, the description is complete: it explains the search scope, all parameter behaviors, and the return shape including count, source, and ordering. No critical calling information appears to be missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate. It does: 'query' is defined as substring match, case-insensitive; 'category' as an optional single-category restriction; 'include_reserved' as whether to include unimplemented parameters. Every parameter receives meaningful semantic context beyond the raw 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?

The description states a specific action ('Text-search over parameter names, aliases, descriptions, values, examples') with a clear resource and scope. This distinguishes it from sibling tools like list_parameters and get_parameter, which imply enumeration and direct lookup rather than substring search.

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?

The description explains the mechanics of the search (substring match, case-insensitivity, category restriction, include_reserved flag) but does not explicitly say when to choose search_parameters over list_parameters or get_parameter. Usage is implied rather than directly contrasted with alternatives.

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

wait_for_generationA

Poll get_generation on a backoff until it reaches done / failed.

Args:
    uuid: The UUID returned by ``generate``.
    timeout_s: Return after this many seconds even if still running.
        Default 45 stays under the 60 s per-call limit most MCP clients
        enforce; a ``timeout`` result just means "call again". Only raise
        it (e.g. for video) on clients you know allow long tool calls.

Returns:
    The terminal generation record — which includes generations that
    failed server-side: those are SUCCESSFUL tool calls returning
    ``processing_state: "failed"`` with empty ``image_urls``, so always
    check the state. On tool failure, an ``isError`` result whose
    ``error`` field is ``"timeout"`` (``message`` names the last
    observed state — the generation keeps running server-side and can be
    re-fetched with ``get_generation`` later), ``"auth"``, or
    ``"failed"``.
ParametersJSON Schema
NameRequiredDescriptionDefault
uuidYes
timeout_sNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavior: polling backoff, timeout semantics (isError with error='timeout', generation keeps running and can be re-fetched), auth/failed errors, and the surprising case where server-side failures are successful calls with processing_state='failed' and empty image_urls.

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 dense but every section earns its place: one-line purpose, compact Args, and a Returns block that clarifies success and error variants. No filler or repetition.

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?

For a tool with nuanced async behavior and no annotations, it covers purpose, input provenance, timeout behavior, terminal states, server-side failure semantics, and client-side error codes. The presence of an output schema further reduces the need to describe return structure.

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

Parameters5/5

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

Schema coverage is 0%, but the description compensates completely: uuid is defined as the value returned by generate, and timeout_s is explained with default, client-limit context, call-again meaning, and guidance for raising it. This far exceeds the bare 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?

The first sentence states a specific action—polling get_generation on backoff until done/failed—which clearly identifies the tool as a blocking wrapper over an asynchronous generation. This differentiates it from siblings like get_generation (single status fetch) and generate (starting the operation).

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?

It explains the uuid comes from generate, implying use after generation is started, and gives explicit guidance about timeout_s relative to client call limits and when to raise it. It does not explicitly state 'use get_generation instead for a one-off status check,' so it lacks an explicit exclusion.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 13 tool updatesv0.3.0
    • First observedcheck_account_status
    • First observedcheckout
    • First observedconfigure_api_key
    • First observedcreate_account
    • First observedgenerate
    • First observedget_balance
    • First observedget_generation
    • First observedget_parameter
    • First observedget_products
    • First observedlist_parameters
    • First observedmanage_api_key
    • First observedsearch_parameters
    • First observedwait_for_generation

TDQS

A4.2/5.0
Disambiguation4/5

Most tools have clearly distinct purposes: parameter discovery, generation lifecycle, account management, and billing. The main ambiguity is between check_account_status and get_balance, which both report credits_remaining and uploads_remaining, potentially causing misselection.

Naming Consistency4/5

Tool names mostly follow a consistent verb_noun snake_case pattern (list_parameters, get_generation, create_account, get_products). Minor deviations like bare verbs 'generate' and 'checkout', plus the broader 'manage_api_key', keep it from being perfectly uniform.

Tool Count5/5

13 tools is well within the ideal range and each tool covers a meaningful part of the service: parameter lookup, generation submission/polling/retrieval, account and API key lifecycle, and product/payment flows. No tool feels redundant or filler, apart from the minor balance-reporting overlap.

Completeness4/5

The surface covers the core domain well: discovering valid parameters, generating images, polling results, managing accounts/API keys, and purchasing credits. Minor gaps exist, such as no generation history listing or cancellation, but agents can complete the primary workflows without dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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/maginaryai/maginary-mcp'

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