maginary-mcp
OfficialThis server lets MCP clients (Claude Desktop, Cursor, etc.) work with Maginary's image/video generation API through simple tools.
Discover prompt-DSL flags: list, search, or fetch details for Maginary generation parameters (aspect ratio, models, video settings, etc.).
Generate images/videos: submit a prompt with
--flagparameters, optionally with a webhook callback URL.Poll generation results: fetch a generation by UUID or wait until it reaches done/failed, then read output image URLs.
Pay via x402: if out of credits,
generatereturns a payment-required payload an x402-capable client can settle on-chain; first payment returns an API key.Manage accounts: create an account, check verification/credits/key status, and manage API keys (create/list/revoke) — useful for onboarding.
Configure API keys: activate a generated key locally (persisted) or use it per-request on the hosted server.
Browse products and buy credits: list plans/pricing, create Stripe checkout sessions, and check credit/uploads balance.
Catalog is always available: parameter tools work without authentication, using a live fetch when reachable or a bundled snapshot offline.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@maginary-mcpgenerate an image of a cat astronaut --style retro --ar 1:1"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
maginary-mcp
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
generatetool that hitsPOST /api/gens/offers
get_generation+wait_for_generationfor polling to a terminal stateworks 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-mcpRequires Python 3.10+.
configuration
Environment variables:
var | default | meaning |
| — | Bearer token from app.maginary.ai/dashboard#api-keys. Required for |
|
| Override for staging or self-hosted. |
|
| Hosted mode only. Sent to the backend as |
| off | Hosted mode only. On: every |
|
| The authorization server named in the protected-resource metadata (the backend, django-oauth-toolkit). |
|
| This server's canonical resource identifier (RFC 8707 audience). |
|
| 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-mcpThe 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.mdThe 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 catalogsearch_parameters(query, category?, include_reserved=false)— text search over names / aliases / desc / examplesget_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 todone/failed; atimeoutresult 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.jsonused 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+Dlicense
MIT.
Available Tools
13 toolscheck_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``.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| password | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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"``.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| password | No | ||
| product_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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"``.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | ||
| callback_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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``.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| password | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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"]``.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| category | No | ||
| include_reserved | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| No | |||
| action | Yes | ||
| password | No | ||
| key_prefix | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| category | No | ||
| include_reserved | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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"``.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
13 tool updates
v0.3.0- First observed
check_account_status - First observed
checkout - First observed
configure_api_key - First observed
create_account - First observed
generate - First observed
get_balance - First observed
get_generation - First observed
get_parameter - First observed
get_products - First observed
list_parameters - First observed
manage_api_key - First observed
search_parameters - First observed
wait_for_generation
TDQS
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.
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.
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.
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
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
OAuth-protected ImagineVid MCP for image, video, and music generation.
Multi-model AI image and video generator. 14 models behind one OAuth-secured MCP endpoint.
Create and manage AI image and video generations through Quriov's fixed public MCP tools.
Generate AI images and videos from any compatible MCP client.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceWraps Flow2API / OpenAI-compatible image generation upstream into an MCP service, providing image generation, history, and caching tools.12MIT

@retomagic/mcpofficial
AlicenseAqualityCmaintenanceEnables image and video generation through the Magicly API using any MCP client. Supports listing models, generating media, and polling predictions.318MIT- FlicenseAqualityCmaintenanceEnables browsing Hedra's model catalog and managing AI generation jobs, including submitting, polling, and uploading files, through MCP clients.14-
- FlicenseNot gradedqualityBmaintenanceEnables AI clients like Claude and ChatGPT to generate images and videos, animate images, create lip-synced videos, list TTS voices, and manage media via remote MCP tools.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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