Server definition
- Hash
- sha256:b4ee406721cff36648081c4cbddfa3a52075977ff5b27e62d8a10d224fe55db0
- What it is
- What a remote MCP server returned when asked what it offers: 16 tools
The blob, as servednamed by its sha256
{
"instructions": "Maginary (spelled M-A-G-I-N-A-R-Y, not 'imaginary') is a Midjourney-style AI image + video generator with a `--flag` prompt DSL and an async HTTP API.\n\n**New users (no API key yet) — pick the shortest path:**\n- **USDC wallet (fastest):** Just call `generate` with your prompt. The 402 response prices the generation; settle it on-chain (x402, USDC on Base) and your account is created automatically.\n- **Wallet auth (no email):** `create_wallet_account` → returns an API key immediately, no email verification.\n- **Email:** `create_account` → user clicks verification email → `manage_api_key(action='create')` → `configure_api_key` → `get_products` → `checkout`. The $10 novice_pack is the recommended starting point. API key creation and checkout require a verified email.\n\n**Prompt rules (IMPORTANT):** Pass the user's words as-is. Do NOT add flags the user did not ask for — no ``--ar``, no ``--flagship``, no model flags, nothing. Flags cost money; adding them without asking is a UX failure. Before the FIRST generation in a conversation, briefly mention the quality option once: standard (default, cheap) or flagship (best, ~4× more expensive) — then generate with whatever they choose, or standard if they don't care. After that, never ask again unless they bring it up. Do NOT ask about aspect ratio — omit ``--ar`` by default; square format gives the most diversity and is the best starting point. Only add ``--ar`` when the user explicitly mentions landscape, portrait, widescreen, etc. Flags go at the END of the prompt. ``--1``/``--2``/``--3``/``--4`` = image count (default 4; only if user specifies). ``--ar 16:9`` = aspect ratio (only if user explicitly asks). ``--flagship`` = best quality (only if user explicitly wants it). Unknown flag: call ``get_parameter(name)`` — never guess.\n\n**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)`.\n\n**Existing users:** Use `search_parameters` / `get_parameter` to discover which flags exist before building a prompt. Use `generate` to kick off a generation, then `wait_for_generation` (or a webhook callback) to fetch the resulting image / video URLs. Flags whose status is `dead`, `mostly-dead`, or `unimplemented` should be avoided.\n\n**Image editing (img2img):** Place image URLs directly in the prompt (e.g. `https://cdn.maginary.ai/…/photo.webp reimagine as watercolor`). If the user already has a URL, use it directly. On local (stdio) connections, `upload_image(file_path=...)` reads a file from disk and returns a CDN URL. `--sref <url>` is style-only, not img2img.\n\n**Follow-up actions:** A completed generation's `processing_result.available_actions` lists what's available (upscale, vary, pan, zoom, img2vid, reroll). Use `execute_action` with the `generation_uuid`, `action_type`, and `parent_image_index`.\n\n**Credits:** When the user asks to generate, just call `generate` — don't check balance first. A zero balance does not mean the user cannot generate (x402 on-chain payment settles inline). The server returns a clear `payment_required` response when credits are needed.",
"tools": [
{
"description": "Check account verification status, credit balance, and API key count.\n\n Use this after ``create_account`` to poll whether the user has clicked the\n verification link. Pass ``email`` + ``password`` (from ``create_account``)\n for Basic auth, or omit both to use the configured API key.\n\n Args:\n email: Account email (for Basic auth).\n password: Account password (for Basic auth).\n\n Returns:\n Dict with ``verified`` (bool), ``email``, ``api_key_count``,\n ``credits_remaining``, ``uploads_remaining``.\n ",
"inputSchema": {
"properties": {
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Account email (for Basic auth). Omit to use API key.",
"title": "Email"
},
"password": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Account password (for Basic auth).",
"title": "Password"
}
},
"title": "check_account_statusArguments",
"type": "object"
},
"name": "check_account_status",
"outputSchema": {
"additionalProperties": true,
"title": "check_account_statusDictOutput",
"type": "object"
}
},
{
"description": "Create a Stripe checkout session for purchasing a product.\n\n Returns a ``checkout_url`` — the user must open it in a browser to\n complete payment. After payment, credits are provisioned automatically\n via webhook. **Present the URL exactly as returned, including the\n ``#fragment`` — do not truncate, reformat, or strip any part of it.**\n\n If the agent has a USDC wallet, skip this entirely — just call\n ``generate`` and the x402 protocol handles payment on-chain.\n\n Args:\n product_id: Product ID from ``get_products``.\n email: Account email (for Basic auth during onboarding).\n password: Account password (for Basic auth during onboarding).\n\n Returns:\n Dict with ``checkout_url``. On failure, an ``isError`` result — e.g.\n ``error: \"email_not_verified\"`` until the user clicks the\n verification link, or ``\"auth\"`` / ``\"failed\"``.\n ",
"inputSchema": {
"properties": {
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Account email (for Basic auth during onboarding).",
"title": "Email"
},
"password": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Account password (for Basic auth).",
"title": "Password"
},
"product_id": {
"description": "Product ID from get_products.",
"title": "Product Id",
"type": "integer"
}
},
"required": [
"product_id"
],
"title": "checkoutArguments",
"type": "object"
},
"name": "checkout",
"outputSchema": {
"additionalProperties": true,
"title": "checkoutDictOutput",
"type": "object"
}
},
{
"description": "Activate an API key. Local (stdio) servers persist it; hosted does not.\n\n Call this after ``manage_api_key(action='create')`` returns a ``raw_key``.\n On a local server the key is saved to ``~/.config/maginary/api_key``\n (chmod 600) and survives restarts. On the hosted server\n (mcp.maginary.ai) nothing can be stored — auth is per-request: the\n response will say ``persisted: false`` and the key must be sent as an\n ``Authorization: Bearer <key>`` header on every request (set it in the\n MCP client's connection config).\n\n Args:\n api_key: The full API key string returned by ``manage_api_key``.\n\n Returns:\n Confirmation dict.\n ",
"inputSchema": {
"properties": {
"api_key": {
"description": "Full API key string from manage_api_key.",
"title": "Api Key",
"type": "string"
}
},
"required": [
"api_key"
],
"title": "configure_api_keyArguments",
"type": "object"
},
"name": "configure_api_key",
"outputSchema": {
"additionalProperties": true,
"title": "configure_api_keyDictOutput",
"type": "object"
}
},
{
"description": "Create a new Maginary account for the given email address.\n\n Returns the auto-generated password — display it to the user ONCE so they\n can save it. A verification email is sent; the user must click the link\n before the account can generate images.\n\n After verification, use ``manage_api_key(action='create')`` with\n ``email`` + ``password`` to get an API key, then ``configure_api_key``\n to activate it.\n\n Args:\n email: The user's email address.\n\n Returns:\n Dict with ``email``, ``password``, and ``message``. On failure, an\n ``isError`` result — e.g. ``error: \"already_exists\"`` (email taken:\n ask the user for their password or a different email),\n ``\"rate_limited\"``, or ``\"failed\"``.\n ",
"inputSchema": {
"properties": {
"email": {
"description": "Email address for the new account.",
"title": "Email",
"type": "string"
}
},
"required": [
"email"
],
"title": "create_accountArguments",
"type": "object"
},
"name": "create_account",
"outputSchema": {
"additionalProperties": true,
"title": "create_accountDictOutput",
"type": "object"
}
},
{
"description": "Create (or access) a Maginary account using a wallet signature.\n\n Sign the message ``Maginary: authenticate <address> at <timestamp>.\n This does not move funds.`` with EIP-191 ``personal_sign`` and pass all\n three values. On success, an API key is returned immediately — no email\n verification needed.\n\n Use this when you have a wallet but no email. The returned ``api_key``\n should be passed as ``Authorization: Bearer <key>`` in the MCP client\n config, or via ``configure_api_key`` (stdio) / ``_meta[\"maginary/api_key\"]``\n (hosted, per-call).\n\n If the wallet already has an account, returns the existing account with\n a fresh API key.\n\n Args:\n address: EVM wallet address (0x..., 42 chars).\n signature: Hex-encoded EIP-191 personal_sign of the auth message.\n timestamp: Unix epoch seconds used in the signed message (must be\n within the last 5 minutes).\n\n Returns:\n Dict with ``address``, ``api_key`` (full key — show once),\n ``key_prefix``, ``created`` (bool), ``message``.\n On failure: ``isError`` with ``error`` = ``\"validation\"``,\n ``\"signature_failed\"``, or ``\"rate_limited\"``.\n ",
"inputSchema": {
"properties": {
"address": {
"description": "EVM wallet address (0x..., 42 chars).",
"title": "Address",
"type": "string"
},
"signature": {
"description": "Hex EIP-191 personal_sign of the auth message.",
"title": "Signature",
"type": "string"
},
"timestamp": {
"description": "Unix epoch seconds used in the signed message.",
"title": "Timestamp",
"type": "integer"
}
},
"required": [
"address",
"signature",
"timestamp"
],
"title": "create_wallet_accountArguments",
"type": "object"
},
"name": "create_wallet_account",
"outputSchema": {
"additionalProperties": true,
"title": "create_wallet_accountDictOutput",
"type": "object"
}
},
{
"description": "Run a follow-up action on a completed generation's image.\n\n After ``generate`` → ``wait_for_generation``, the response's\n ``processing_result.available_actions`` lists what's possible per slot.\n Call this tool with one of those action types.\n\n Args:\n generation_uuid: UUID of the parent generation (from ``generate``).\n action_type: One of the values from ``available_actions`` — e.g.\n ``\"upscale_2x\"``, ``\"upscale_1_5x\"``, ``\"vary_strong\"``,\n ``\"vary_subtle\"``, ``\"pan_left\"``, ``\"pan_right\"``,\n ``\"pan_up\"``, ``\"pan_down\"``, ``\"zoom_out_2x\"``,\n ``\"zoom_out_1_5x\"``, ``\"img2vid_basic\"``, ``\"reroll\"``.\n parent_image_index: The slot index of the image to act on (0, 1,\n 2, or 3 for a 4-image grid). Required for per-slot actions;\n omit for ``\"reroll\"`` (global action).\n prompt: Optional replacement prompt. For ``vary_*`` you can steer\n the variation with a new prompt; for ``img2vid_basic`` you can\n describe the desired motion.\n callback_url: Optional webhook URL (same as ``generate``).\n\n Returns:\n The newly created child generation record (same shape as\n ``generate``'s return — poll it with ``wait_for_generation``).\n\n On failure, same ``isError`` contract as ``generate``:\n ``\"auth\"``, ``\"payment_required\"`` (with x402 challenge),\n or ``\"failed\"``.\n ",
"inputSchema": {
"properties": {
"action_type": {
"description": "Action from available_actions, e.g. upscale_2x, vary_strong, img2vid_basic, reroll.",
"title": "Action Type",
"type": "string"
},
"callback_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "HTTPS webhook URL for done/failed notifications.",
"title": "Callback Url"
},
"generation_uuid": {
"description": "UUID of the parent generation.",
"title": "Generation Uuid",
"type": "string"
},
"parent_image_index": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Slot index (0-3) of the image to act on. Omit for global actions like reroll.",
"title": "Parent Image Index"
},
"prompt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional replacement prompt for vary/img2vid actions.",
"title": "Prompt"
}
},
"required": [
"generation_uuid",
"action_type"
],
"title": "execute_actionArguments",
"type": "object"
},
"name": "execute_action",
"outputSchema": {
"additionalProperties": true,
"title": "execute_actionDictOutput",
"type": "object"
}
},
{
"description": "Kick off a generation via POST /api/gens/.\n\n Args:\n prompt: The user's words, passed through as-is. Do NOT add flags the\n user did not ask for — no ``--ar``, no ``--flagship``, no model\n flags. Every extra flag costs credits; adding them unrequested is\n wrong. Standard quality is the default and is cheap; ``--flagship``\n is ~4× more expensive and must only be used when the user\n explicitly asks for best quality.\n\n If the user asks about quality or aspect ratio: ask them first\n (standard vs flagship, landscape vs portrait) before generating.\n\n Flags go at the END, only when the user asked:\n ``--1``/``--2``/``--3``/``--4`` = image count (default 4),\n ``--ar 16:9`` = aspect ratio, ``--flagship`` = best quality.\n Unknown flag: call ``get_parameter(name)`` first — never guess.\n\n Examples — user says \"a fox\": prompt is ``\"a fox\"``.\n User says \"a fox, landscape, best quality\":\n prompt is ``\"a fox --ar 16:9 --flagship\"``.\n\n **Image-to-image (img2img):** Place one or more public image URLs\n in the prompt, followed by editing instructions:\n ``\"https://cdn.example.com/photo.webp reimagine as oil painting --ar 16:9\"``\n The engine extracts URLs automatically and switches to img2img mode.\n Multiple URLs trigger multi-input mode (compositing/combining).\n Use ``upload_image`` first if images aren't already hosted.\n\n **Image-to-video:** Place an image URL in the prompt AND add\n ``--mp4`` plus video flags (``--5sec``, ``--1080p``). Or use\n ``execute_action`` with ``action_type=\"img2vid_basic\"`` on a\n completed generation's image.\n\n **Style reference (--sref) is NOT img2img:** ``--sref <url>``\n copies the visual *style* of a reference image (colors, mood,\n composition) without using the image content as input. A bare URL\n in the prompt edits the actual image; ``--sref`` transfers style.\n\n callback_url: Optional HTTPS URL that will receive a webhook when the\n generation reaches done / failed. See\n https://maginary.ai/blog/webhooks-guide for signature verification.\n\n Returns:\n On success, the created generation record. Key fields: ``uuid`` (use\n to poll), ``action_type``, ``processing_state``,\n ``expected_output_count``.\n\n On failure, an ``isError`` result instead (nothing is raised), with a\n JSON body whose ``error`` field is one of:\n\n - ``\"auth\"`` — no/invalid API key. Surface the message directly to\n the human.\n - ``\"payment_required\"`` — out of credits. The body carries\n ``billing_url`` and top-level x402 fields (``accepts``,\n ``resource``): either send the human to ``billing_url`` to top up,\n or pay programmatically via x402 (settle ``accepts[0]`` with USDC\n on Base and retry).\n - ``\"demo_not_found\"`` — ``--demo`` prompt has no matching seeded\n generation. ``available_demos`` lists valid prompts.\n - ``\"failed\"`` — anything else (invalid prompt, rate limit, backend\n or network error); see ``message``.\n\n x402 over MCP: a ``payment_required`` result also carries the x402\n fields at the top level (``accepts``, ``resource``); an x402-capable\n client signs ``accepts[0]`` and calls this tool again with the payment\n in ``_meta[\"x402/payment\"]``. The settled call returns the generation\n with ``x402_receipt`` (and ``_meta[\"x402/payment-response\"]``); a\n wallet's first settlement creates its account. Subsequent requests\n use wallet-signed auth headers (X-Wallet-Address/Signature/Timestamp)\n or pass an API key as ``_meta[\"maginary/api_key\"]``.\n\nEvery 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)`.",
"inputSchema": {
"properties": {
"callback_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "HTTPS webhook URL for done/failed notifications.",
"title": "Callback Url"
},
"prompt": {
"description": "The user's words as-is, flags at the end. Do NOT add flags the user did not ask for.",
"title": "Prompt",
"type": "string"
}
},
"required": [
"prompt"
],
"title": "generateArguments",
"type": "object"
},
"name": "generate",
"outputSchema": {
"additionalProperties": true,
"title": "generateDictOutput",
"type": "object"
}
},
{
"description": "Check remaining credits and uploads for the authenticated account.\n\n Args:\n email: Account email (for Basic auth).\n password: Account password (for Basic auth).\n\n Returns:\n Dict with ``credits_remaining`` and ``uploads_remaining``.\n ",
"inputSchema": {
"properties": {
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Account email (for Basic auth).",
"title": "Email"
},
"password": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Account password (for Basic auth).",
"title": "Password"
}
},
"title": "get_balanceArguments",
"type": "object"
},
"name": "get_balance",
"outputSchema": {
"additionalProperties": true,
"title": "get_balanceDictOutput",
"type": "object"
}
},
{
"description": "Fetch a generation by UUID (GET /api/gens/{uuid}/).\n\n Args:\n uuid: The UUID returned by ``generate``.\n\n Returns:\n The full generation record. If terminal, ``image_urls[]`` holds the\n finished outputs and ``processing_result.slots[]`` the per-slot detail.\n NOTE: a generation that failed server-side is a SUCCESSFUL tool call\n returning ``processing_state: \"failed\"`` — always check the state,\n never infer success from the absence of a tool error.\n\n **Follow-up actions:** A completed generation's\n ``processing_result.available_actions`` maps slot indices to valid\n action types. E.g. ``{\"0\": [\"upscale_2x\", \"vary_strong\", ...],\n \"global\": [\"reroll\"]}``. Use ``execute_action`` with the ``uuid``,\n a chosen ``action_type``, and the ``parent_image_index`` (the slot\n key as an int) to run an action.\n\n Hosted: a key obtained mid-session may be passed as\n ``_meta[\"maginary/api_key\"]``.\n ",
"inputSchema": {
"properties": {
"uuid": {
"description": "Generation UUID from generate or execute_action.",
"title": "Uuid",
"type": "string"
}
},
"required": [
"uuid"
],
"title": "get_generationArguments",
"type": "object"
},
"name": "get_generation",
"outputSchema": {
"additionalProperties": true,
"title": "get_generationDictOutput",
"type": "object"
}
},
{
"description": "Return the full record for a single parameter (canonical name or alias).\n\n Args:\n name: Parameter name with or without leading ``--`` (e.g. ``ar``,\n ``--ar``, ``aspect``). Case-insensitive.\n\n Returns:\n The parameter dict. Not-found is an ``isError`` result — surface it\n rather than fabricating a param.\n ",
"inputSchema": {
"properties": {
"name": {
"description": "Parameter name with or without --, e.g. ar, --ar, aspect.",
"title": "Name",
"type": "string"
}
},
"required": [
"name"
],
"title": "get_parameterArguments",
"type": "object"
},
"name": "get_parameter",
"outputSchema": {
"additionalProperties": true,
"title": "get_parameterDictOutput",
"type": "object"
}
},
{
"description": "List available Maginary products/plans with pricing.\n\n No authentication required. Use this to present purchase options to the\n user. The ``novice_pack`` ($10, 150 credits) is the recommended starting\n point.\n\n Returns:\n Dict with ``count`` and ``products`` — each product carries ``id``,\n ``short_name``, ``title``, ``description``, ``price_cents``,\n ``credits``, ``uploads``, ``is_subscription``. (The backend sends a\n bare array; it is wrapped here because FastMCP validates tool output\n against the dict annotation and rejects a top-level list.)\n ",
"inputSchema": {
"properties": {},
"title": "get_productsArguments",
"type": "object"
},
"name": "get_products",
"outputSchema": {
"additionalProperties": true,
"title": "get_productsDictOutput",
"type": "object"
}
},
{
"description": "List Maginary prompt-DSL parameters.\n\n Args:\n category: Restrict to one category (e.g. ``composition``, ``video``,\n ``model``, ``outpaint``). Call with no filters once — the response's\n ``categories`` / ``statuses`` maps are the full taxonomy.\n status: Restrict to one status (``live``, ``mostly-dead``,\n ``unimplemented``).\n include_reserved: When False (default) drop ``unimplemented``\n (recognized-but-blocked) parameters from the result.\n\n Returns:\n A dict with ``count``, ``source`` (``live`` vs. ``bundled-snapshot``),\n ``categories`` / ``statuses`` (the filter taxonomy), and ``parameters``\n (the array of matching entries).\n ",
"inputSchema": {
"properties": {
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter by category, e.g. composition, video, model, outpaint.",
"title": "Category"
},
"include_reserved": {
"default": false,
"description": "Include unimplemented (blocked) parameters.",
"title": "Include Reserved",
"type": "boolean"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter by status: live, mostly-dead, or unimplemented.",
"title": "Status"
}
},
"title": "list_parametersArguments",
"type": "object"
},
"name": "list_parameters",
"outputSchema": {
"additionalProperties": true,
"title": "list_parametersDictOutput",
"type": "object"
}
},
{
"description": "Create, list, or revoke Maginary API keys (up to 10 per account).\n\n Auth: pass ``email`` + ``password`` for Basic auth (onboarding), or omit\n both to use the configured API key (normal operation).\n\n Args:\n action: One of ``create``, ``list``, ``revoke``.\n name: Key name (required for ``create``).\n key_prefix: 8-char prefix of the key to revoke (required for ``revoke``).\n email: Account email (for Basic auth).\n password: Account password (for Basic auth).\n\n Returns:\n For ``create``: dict with ``raw_key`` (the full key — show once, then\n use ``configure_api_key`` to activate it), ``key_prefix``, ``name``.\n For ``list``: dict with ``keys`` array.\n For ``revoke``: success/error message.\n ",
"inputSchema": {
"properties": {
"action": {
"description": "One of: create, list, revoke.",
"title": "Action",
"type": "string"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Account email (for Basic auth).",
"title": "Email"
},
"key_prefix": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "8-char prefix of key to revoke (required for revoke).",
"title": "Key Prefix"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Key name (required for create).",
"title": "Name"
},
"password": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Account password (for Basic auth).",
"title": "Password"
}
},
"required": [
"action"
],
"title": "manage_api_keyArguments",
"type": "object"
},
"name": "manage_api_key",
"outputSchema": {
"additionalProperties": true,
"title": "manage_api_keyDictOutput",
"type": "object"
}
},
{
"description": "Text-search over parameter names, aliases, descriptions, values, examples.\n\n Args:\n query: Substring match, case-insensitive.\n category: Optional single-category restriction.\n include_reserved: Whether to include ``unimplemented`` parameters.\n\n Returns:\n Dict with ``count``, ``source`` (``live`` vs. ``bundled-snapshot``),\n and ``parameters`` (ordered as they appear in the catalog).\n ",
"inputSchema": {
"properties": {
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter by category, e.g. composition, video, model.",
"title": "Category"
},
"include_reserved": {
"default": false,
"description": "Include unimplemented (blocked) parameters.",
"title": "Include Reserved",
"type": "boolean"
},
"query": {
"description": "Search term (case-insensitive substring match).",
"title": "Query",
"type": "string"
}
},
"required": [
"query"
],
"title": "search_parametersArguments",
"type": "object"
},
"name": "search_parameters",
"outputSchema": {
"additionalProperties": true,
"title": "search_parametersDictOutput",
"type": "object"
}
},
{
"description": "Upload a local image and get a CDN URL for img2img or ``--sref``.\n\n Only available on local (stdio) connections. On hosted/remote\n connections, place an existing image URL directly in the prompt.\n\n Place the returned ``url`` in a ``generate`` prompt:\n ``generate(\"https://cdn.maginary.ai/…/photo.webp reimagine as oil painting\")``\n\n Args:\n file_path: Path to an image file on disk (JPEG, PNG, WebP, HEIC).\n filename: Original filename. Inferred from ``file_path`` if omitted.\n\n Returns:\n Dict with ``url`` (the public CDN URL), ``exists`` (deduplicated),\n ``credits_deducted``, and ``message``.\n ",
"inputSchema": {
"properties": {
"file_path": {
"description": "Path to a local image (JPEG, PNG, WebP, HEIC).",
"title": "File Path",
"type": "string"
},
"filename": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Override filename. Inferred from file_path if omitted.",
"title": "Filename"
}
},
"required": [
"file_path"
],
"title": "upload_imageArguments",
"type": "object"
},
"name": "upload_image",
"outputSchema": {
"additionalProperties": true,
"title": "upload_imageDictOutput",
"type": "object"
}
},
{
"description": "Poll ``get_generation`` on a backoff until it reaches done / failed.\n\n Args:\n uuid: The UUID returned by ``generate``.\n timeout_s: Return after this many seconds even if still running.\n Default 45 stays under the 60 s per-call limit most MCP clients\n enforce; a ``timeout`` result just means \"call again\". Only raise\n it (e.g. for video) on clients you know allow long tool calls.\n\n Returns:\n The terminal generation record — which includes generations that\n failed server-side: those are SUCCESSFUL tool calls returning\n ``processing_state: \"failed\"`` with empty ``image_urls``, so always\n check the state. On tool failure, an ``isError`` result whose\n ``error`` field is ``\"timeout\"`` (``message`` names the last\n observed state — the generation keeps running server-side and can be\n re-fetched with ``get_generation`` later), ``\"auth\"``, or\n ``\"failed\"``.\n\n **Follow-up actions:** A ``done`` generation's\n ``processing_result.available_actions`` maps slot indices to valid\n action types — e.g. ``{\"0\": [\"upscale_2x\", \"vary_strong\",\n \"pan_left\", \"zoom_out_2x\", \"img2vid_basic\", ...], \"global\":\n [\"reroll\"]}``. Use ``execute_action`` with the ``uuid``, a chosen\n ``action_type``, and the ``parent_image_index`` (the slot key as an\n int) to run an action on a specific output image.\n ",
"inputSchema": {
"properties": {
"timeout_s": {
"default": 45,
"description": "Max seconds to wait before returning a timeout result.",
"title": "Timeout S",
"type": "number"
},
"uuid": {
"description": "Generation UUID to poll.",
"title": "Uuid",
"type": "string"
}
},
"required": [
"uuid"
],
"title": "wait_for_generationArguments",
"type": "object"
},
"name": "wait_for_generation",
"outputSchema": {
"additionalProperties": true,
"title": "wait_for_generationDictOutput",
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:b4ee406721cff36648081c4cbddfa3a52075977ff5b27e62d8a10d224fe55db0 | sha256sum