Skip to main content
Glama
Spicy-API
by Spicy-API

@spicyapi/mcp

The official local MCP server for SpicyAPI. It lets the AI assistant you already use — Claude Desktop, Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI or any MCP client — browse the live model catalog, compare prices, create generation tasks and collect results, with every billable step confirmed by you.

This package installs spicyapi-mcp (stdio) and spicyapi-mcp-http (loopback-only Streamable HTTP). It does not contain the CLI or the Agent Skill.

Full, beginner-friendly guide: docs.spicyapi.ai/docs/mcp.

What it does, in plain words

MCP (Model Context Protocol) is an open standard for giving AI assistants extra abilities. Once this server is added to your assistant, you can ask in ordinary language — "make a five-second video from this photo" — and the assistant:

  1. finds a suitable model in the live catalog and reads what it accepts;

  2. uploads your local file if there is one;

  3. gets an exact USD quote and stops to ask you before anything is charged;

  4. starts the task, waits for it and gives you the result link.

The server runs on your own computer. Your assistant app starts it when needed; there is nothing to host.

Related MCP server: Index9 MCP Server

Requirements

  • Node.js 22.13 or later (node --version). npx ships with Node.js.

  • A SpicyAPI API key (below), and funds on the account for paid tasks. Browsing, quoting and reading results are free.

  • An MCP client. Creating, retrying and purging tasks additionally require a client that supports MCP form elicitation (the protocol's way of asking the user a question). In a client without it those three tools return an error, usually containing did not declare the required capability. Nothing is created, reserved, charged or destroyed: creation has fetched only its free quote by then, and retry and purge have sent no request. The read-only tools still work.

Get a key first

  1. Create an account at spicyapi.ai/register — if sign-ups are paused, that page shows how to join the waitlist.

  2. On the API keys page choose Create key. Name it after the assistant that will use it. Under Advanced you can set a daily cap, monthly budget, lifetime cap, allowed models, IP allowlist and expiry; new keys always get the platform's default daily cap unless you enter 0 for no cap.

  3. Copy the key. It starts with sk-spicy- and is shown once.

  4. For the terminal-based setups below, export it in the terminal you will run the setup command from:

export SPICY_API_KEY="sk-spicy-..."   # paste your own key

In Windows PowerShell: $env:SPICY_API_KEY = "sk-spicy-...".

Add it to your client

Every client below runs the same stdio server: npx --yes --package=@spicyapi/mcp spicyapi-mcp.

You never run this server yourself — your MCP client starts it. Launched by hand it just waits silently on stdin, which looks like a hang. And it needs --package=@spicyapi/mcp in front of the binary name, because this package ships two of them; plain npx @spicyapi/mcp fails with could not determine executable to run.

Claude Desktop

  1. Open Settings → Developer → Edit Config. The file is ~/Library/Application Support/Claude/claude_desktop_config.json on macOS and %APPDATA%\Claude\claude_desktop_config.json on Windows.

  2. Paste the block below (or add the spicyapi entry to an existing mcpServers) and replace YOUR_SPICY_API_KEY.

  3. Quit Claude Desktop completely and reopen it — it reads this file only at launch.

{
  "mcpServers": {
    "spicyapi": {
      "command": "npx",
      "args": ["--yes", "--package=@spicyapi/mcp", "spicyapi-mcp"],
      "env": { "SPICY_API_KEY": "YOUR_SPICY_API_KEY" }
    }
  }
}

Claude Code

claude mcp add spicyapi \
  -e SPICY_API_KEY=$SPICY_API_KEY \
  -- npx --yes --package=@spicyapi/mcp spicyapi-mcp

The default scope is the current project; add --scope user for every project. Do not use --scope project, which writes the key into a .mcp.json inside the repository. Check with claude mcp list or /mcp. On native Windows, if the server fails to start, use -- cmd /c npx --yes --package=@spicyapi/mcp spicyapi-mcp.

Codex

codex mcp add spicyapi \
  --env SPICY_API_KEY=$SPICY_API_KEY \
  -- npx --yes --package=@spicyapi/mcp spicyapi-mcp

That writes ~/.codex/config.toml, which the Codex CLI, the IDE extension and the ChatGPT desktop app all read — configure it once and all three pick it up. Check with codex mcp list or /mcp.

Both terminal commands copy SPICY_API_KEY out of your current shell into that client's local config, so run them in a terminal where the key is already exported. If it was not, remove the server (claude mcp remove spicyapi / codex mcp remove spicyapi) and add it again.

Cursor, Windsurf and Gemini CLI

Cursor (~/.cursor/mcp.json), Windsurf (~/.codeium/windsurf/mcp_config.json) and Gemini CLI (~/.gemini/settings.json) share the same shape as Claude Desktop:

{
  "mcpServers": {
    "spicyapi": {
      "command": "npx",
      "args": ["--yes", "--package=@spicyapi/mcp", "spicyapi-mcp"],
      "env": { "SPICY_API_KEY": "YOUR_SPICY_API_KEY" }
    }
  }
}

On Windows these live under %USERPROFILE%. If a file already has other settings, merge mcpServers into it — the whole file must stay valid JSON, with no comments or trailing commas. Restart the client if the tools do not appear (Gemini CLI: /mcp lists them).

Those are user-level files outside your repository. Never copy that block, with a real key in it, into a project file that gets committed — such as a project-level .cursor/mcp.json.

VS Code

.vscode/mcp.json is committed with your repository, so let VS Code prompt for the key and keep it in its own secret storage:

{
  "inputs": [
    {
      "id": "spicyapi-key",
      "type": "promptString",
      "description": "SpicyAPI key",
      "password": true
    }
  ],
  "servers": {
    "spicyapi": {
      "type": "stdio",
      "command": "npx",
      "args": ["--yes", "--package=@spicyapi/mcp", "spicyapi-mcp"],
      "env": { "SPICY_API_KEY": "${input:spicyapi-key}" }
    }
  }
}

Start it from the code lens above the entry or MCP: List Servers, paste the key when asked, then use the tools from Chat in Agent mode.

Any other MCP client

Use the same command, args and env. Each client owns its config location and format, and both change between versions — their own documentation is authoritative.

Check that it works

Ask your assistant, in order:

  1. "Check the SpicyAPI service status."spicyapi_service_status needs no key, so this proves the server starts.

  2. "What is my SpicyAPI balance?"spicyapi_balance_get proves the key reaches the server.

  3. "Which SpicyAPI tools do you have?" — expect 15 tools prefixed spicyapi_.

None of these costs anything.

Then ask for something real

Use SpicyAPI to list the image models I can call, pick an inexpensive one, generate a cinematic night portrait, and give me the result link when it finishes.

The agent reads the catalog, fetches the model's schema, obtains an exact quote and stops for your confirmation before anything is charged.

More prompts to try:

  • "How much SpicyAPI balance do I have, and what did I spend this week?" — balance and usage, free.

  • "Find SpicyAPI models that turn an image into a video and compare what a 5-second clip costs on each." — catalog plus quotes, free.

  • "Turn /Users/me/Desktop/portrait.jpg into a 5-second video with a slow push-in." — upload, then a confirmed task.

  • "Show my SpicyAPI tasks from the last three days that failed, and why." — task history, free; a retry afterwards asks for confirmation.

Model IDs always come from the live catalog. Any placeholder such as MODEL_ID_FROM_CATALOG in SpicyAPI documentation means an exact ID selected from that catalog, not a literal value.

Tools

Tool

Purpose

Read-only

Billable

Confirmation

spicyapi_service_status

Public health and readiness; no key needed

Yes

No

No

spicyapi_docs_search

Search the bundled first-party documentation index; no key

Yes

No

No

spicyapi_models_list

Enabled models and account-specific prices

Yes

No

No

spicyapi_model_get

One model and its current input schema

Yes

No

No

spicyapi_balance_get

Available, held and total balance

Yes

No

No

spicyapi_usage_get

Settled USD usage for the current key

Yes

No

No

spicyapi_tasks_list

One page of task metadata for the current key

Yes

No

No

spicyapi_task_get

Read one task, including ready result links

Yes

No

No

spicyapi_task_wait

Wait up to 300 seconds for a task to reach a terminal state

Yes

No

No

spicyapi_task_quote

Price an exact request without creating anything

Yes

No

No

spicyapi_upload_file

Read, upload and commit a local file; return its spicy:// URI

No

No

No

spicyapi_download_url_create

Short-lived signed URL for a task output

No

No

No

spicyapi_task_create

Create an asynchronous generation task

No

Yes

Always

spicyapi_task_retry

Create a new task from a failed or expired one

No

Yes

Always

spicyapi_task_purge

Destroy one terminal task's stored content (destructiveHint)

No

No

Always

The server also registers two resources — spicyapi://docs/index and spicyapi://contract/openapi — and one prompt. spicyapi_generation_workflow is a prompt, not a tool — it is registered with registerPrompt, takes goal and an optional model, and does not appear in SPICYAPI_MCP_TOOLS. Hosts surface it wherever they list MCP prompts.

Parameters

Tool

Parameters (required in bold)

spicyapi_service_status

none

spicyapi_docs_search

query (default ""), limit (1–25, default 10)

spicyapi_models_list

modality (image / video / audio / text), provider, task, search, includeSchema, includeExamples (both default false)

spicyapi_model_get

model

spicyapi_balance_get

none

spicyapi_usage_get

from, to (YYYY-MM-DD, UTC)

spicyapi_tasks_list

from, to, state, model, limit (1–100, default 20), cursor

spicyapi_task_get

taskId

spicyapi_task_wait

taskId, timeoutSeconds (1–300, default 60), intervalSeconds (1–60, default adaptive)

spicyapi_upload_file

path (absolute; ~/, and ~\ on Windows, is expanded), contentType (only when the extension is missing or wrong)

spicyapi_download_url_create

taskId, key

spicyapi_task_quote

model, input, callBackUrl

spicyapi_task_create

model, input, callBackUrl, idempotencyKey, retentionSeconds

spicyapi_task_retry

taskId, idempotencyKey

spicyapi_task_purge

taskId

Model input schemas are returned as plain JSON Schema: display-only and rate-card annotations are stripped before they reach the agent.

spicyapi_task_create accepts an optional retentionSeconds that shortens how long that one task's generated media, result payload, prompt and other input text are kept; it can never extend them, 0 removes them once the task reaches a terminal state, and billing records are always kept.

Its optional callBackUrl must be a public https:// address. Plain http:// is refused, and so are localhost, private network addresses, explicit ports other than 443 and 80, and URLs carrying credentials; each returns 400 with Invalid callback URL. http:// has no development exception because the delivery body carries the prompt and signed links to the result.

spicyapi_task_purge is annotated destructiveHint: true and removes a terminal task's generated media, result payload, prompt and other input text. It destroys content, not the record of what it cost — the ledger entry, charged amount, model, state, timestamps and request ID all survive — so it is never a refund. Only terminal tasks are accepted. An accepted task cannot be canceled and there is no cancellation API, so for a queued or running task, wait until it finishes (spicyapi_task_wait), then purge it. It takes no idempotency key, because the task ID is the idempotency key: a repeat after a dropped response returns the original purgedAt and changes nothing. Its result carries only the task ID, content state and removal metadata: no links, tickets or output keys, because leaving a way to fetch the content in the same message that reports its destruction would defeat the point.

How spending is protected

Billable tools use protocol elicitation and signed request state. Task creation fetches and binds the exact quote, then asks you to confirm its USD estimate and maximum charge. An agent cannot bypass that confirmation.

  • The question goes to the user, not the model. The client renders it; the agent has no way to answer it.

  • The answer is bound to the exact arguments. If the model, input or any other argument changes between the question and the answer, the call fails with confirmed request state does not match the current tool arguments and nothing is created.

  • Declining creates, charges and destroys nothing. A declined or cancelled confirmation returns operation declined; … with what did and did not happen. For task creation that is no task was created and no funds were reserved or charged (only the free price quote had been requested) — the quote shown in the question was already fetched. Retry and purge send no request before confirmation, so theirs ends in no SpicyAPI request was made. Leave any "auto-accept elicitation" setting off for this server.

  • No elicitation, no spending. A client without form elicitation cannot answer the question, so creation fails right after the free quote and nothing is created or charged.

  • Quotes last five minutes. Confirming after that fails with 40901; ask again for a fresh quote.

  • Retry confirmations carry no price. A retry is a new task at the model's current price; use spicyapi_task_quote first if you want the number.

  • Recovery reuses the idempotency key. The confirmation shows it, and a failure after confirmation returns it with a recovery hint. Calling spicyapi_task_create again with that idempotencyKey and the unchanged request returns the original task instead of a second charge.

  • Failed and expired tasks are never charged; the hold is released automatically. A successful task settles on actual usage, capped at the accepted hold. Accepted tasks cannot be cancelled.

Call creation directly once the model input is ready. The separate spicyapi_task_quote tool is for independent price comparisons, not a prerequisite. Health and balance checks are optional diagnostics, not a per-task checklist.

Results

spicyapi_task_get, spicyapi_task_wait and verified v2 webhooks all include ready output.assets[].url links. Use them directly — never send the API key to storage. A complete verified callback needs no extra task lookup and no download ticket. Query again for pending assets or expired links; spicyapi_download_url_create remains available for legacy integrations and explicit link renewal, and its signed URL lasts 20 minutes.

Some models answer in output.text rather than with a file — audio transcription is the plain case, an ordinary asynchronous task whose result is words. An empty output.assets on such a model is the expected shape, not a failure, so report the text instead of looking for a missing link.

spicyapi_task_wait polls adaptively by default, starting at about two seconds and backing off to at most ten. Set intervalSeconds only for a fixed interval. Waiting is bounded to 60 seconds by default and 300 at most per call; a local timeout does not cancel the accepted task.

Generated artefacts are kept for about 14 days at most, prompts for 30 days, uploads for one day — see Retention and destruction. Copy anything you want to keep.

Usage reports

spicyapi_usage_get takes optional from and to dates in YYYY-MM-DD. It queries only the API key configured for this MCP process — there is no user, key or workspace override.

  • UTC range [from,to), up to 92 days. By default to is tomorrow UTC and from is seven days earlier.

  • Task counts are grouped by creation day and model.

  • totalSpend and each spend are exact decimal USD strings covering settled charges only; pending holds are excluded and late settlement can change earlier days.

  • This is a usage report, not account balance or remaining key budget, and is never required before generating. Observe Retry-After when reporting is rate limited.

spicyapi_tasks_list finds tasks after a restart or a missed callback. It returns one page of metadata with no inputs, no result URLs and no automatic detail requests. Filters: from, to, state, model, limit, cursor. Keep the UTC dates fixed while paging and pass nextCursor unchanged. Default window seven days ending tomorrow UTC, 92 days maximum; page size 20, capped at 100. cost is final only when settled is true. Do not use history for status polling or as a prerequisite to generation.

This endpoint has its own account-wide bucket: a burst of 30 requests, refilling 30 per minute, shared by every key on the account. Unlike the general API limit it fails closed, so it still rejects when the limiter is degraded. Use it for reconciliation, not polling.

Local files

spicyapi_upload_file takes the absolute path the user gave, reads the file, uploads the bytes from this machine and commits the upload in one call, then returns the committed spicy:// URI to put in a model input field. There is no separate commit tool: nothing on the MCP side ever holds a half-finished upload. Split-step uploads (ticket, PUT, commit) belong to SDK code, which finishes them with commitUploadedFile. Images (JPEG, PNG, WebP, GIF) up to 10 MiB; MP4 / WebM video and MP3 / WAV audio up to 90 MiB. Content type is inferred from the extension. Public HTTPS media URLs need no upload. Relative paths are refused; a leading ~/ (and ~\ on Windows) is expanded to the home directory. If the extension is not recognised, the error lists the nine it infers: gif, jpeg, jpg, png, webp, mp4, webm, mp3, wav.

The server reads only under the user's home directory. Symlinks are resolved before the check, so a link pointing out of an allowed root is refused. The guard exists for prompt injection — a path that arrives inside an email, a web page or a task description is data, not an instruction — not to restrict the person running the server, who can already read their own files.

Set SPICY_MCP_UPLOAD_ROOTS in the server's env to narrow or widen that; it replaces the default. Entries are separated like PATH: : on macOS and Linux, ; on Windows. ~ is not expanded in this variable, so write full paths.

{
  "env": {
    "SPICY_API_KEY": "YOUR_SPICY_API_KEY",
    "SPICY_MCP_UPLOAD_ROOTS": "/Users/you/Pictures:/Users/you/Movies"
  }
}

On Windows the same entry reads "SPICY_MCP_UPLOAD_ROOTS": "C:\\Users\\you\\Pictures;D:\\Renders" (backslashes doubled inside JSON). A root that does not exist matches nothing; the refusal message lists the roots in effect.

Environment variables

Variable

Used by

Meaning

SPICY_API_KEY

both entrypoints

Your API key. Required for everything except status and docs search

SPICY_MCP_UPLOAD_ROOTS

both entrypoints

Directories spicyapi_upload_file may read, separated by : (; on Windows). Default: home directory

SPICY_MCP_HTTP_TOKEN

spicyapi-mcp-http

Required bearer token, at least 32 bytes, different from SPICY_API_KEY

SPICY_MCP_HOST

spicyapi-mcp-http

127.0.0.1 (default), localhost or ::1; anything else is refused

SPICY_MCP_PORT

spicyapi-mcp-http

Port, default 8765

HTTP entrypoint

spicyapi-mcp-http serves Streamable HTTP on loopback only. Most users want the stdio entrypoint above instead; use this for a client that connects to an already-running server by URL.

export SPICY_API_KEY="sk-spicy-..."
export SPICY_MCP_HTTP_TOKEN="$(node -e "console.log(require('node:crypto').randomBytes(32).toString('hex'))")"
npx --yes --package=@spicyapi/mcp spicyapi-mcp-http
# SpicyAPI MCP HTTP listening at http://127.0.0.1:8765/mcp
  • The MCP endpoint is /mcp and requires Authorization: Bearer <SPICY_MCP_HTTP_TOKEN>; without it the server answers 401.

  • GET /healthz returns {"ok":true} without authentication.

  • It refuses to start on a non-loopback address, with a token shorter than 32 bytes, or with a token equal to SPICY_API_KEY.

  • Host and Origin headers must be local, so web pages on other sites cannot drive it; request bodies are capped at 2 MiB.

Loopback means only programs on the same computer can connect — not other devices on the network.

Troubleshooting

Symptom

Fix

No SpicyAPI tools in the client

Restart the client fully; validate the JSON (no comments or trailing commas); check the file path; check node --version is 22.13 or later

npx: command not found / spawn npx ENOENT

Install Node.js from nodejs.org, or use the absolute path from which npx / where npx; on Windows try "command": "cmd" with /c npx … args

could not determine executable to run

Add --package=@spicyapi/mcp before spicyapi-mcp

SPICY_API_KEY is required for authenticated API operations

The key is not reaching the server: fix the env block, or re-add the server from a shell where the key is exported

401

Key mistyped, revoked or expired — create a new key

40201 / 40202 / 40301

Top up; raise the key's cap or wait for the UTC reset; allow the model on the key

40003

The uploaded bytes do not match their ticket; call spicyapi_upload_file again and use the new spicy:// URI

40004

No deployment can serve that exact combination of settings; change the parameter named in the message against the model's schema, do not just retry

503

A dependency is briefly unavailable; wait for Retry-After, then repeat the call

50302

A synchronous generation failed upstream and was already refunded; sending the same request again is safe

did not declare the required capability

The client lacks elicitation support; nothing was created or charged (creation fetched only its free quote). Update it, or use the CLI for paid tasks

confirmed request state does not match the current tool arguments

The request changed after the question was asked; start the creation again

40901

Quote expired or price changed; quote and confirm again

path must be absolute / no such file / may only read files under …

Give the full path; check it exists; move the file under an allowed root

contentType is required unless the file extension is one of: …

Rename the file with a listed extension, or pass contentType

operation declined; …

The confirmation was declined or cancelled; the message says whether only the free quote had been requested

task … did not reach a terminal state within …

The task is still running — wait again or look it up later; it was not cancelled

Errors from the API carry status, code and requestId; keep the request ID for support. See Errors for every code.

A failed task is different from a failed call: it comes back with state: "failed", an errorCode from a closed set, and an errorMessage. Relay errorMessage to the user — when the model service gave a specific reason it is passed through in English, untranslated, with service names, hosts, URLs, request and task IDs and account details removed — but branch only on errorCode, which does not change with the wording or the language.

What this server does not do

It submits and tracks native asynchronous tasks; it does not stream chat tokens, and it has no chat tool to add. The catalogue's text models are served by the compatible layers instead — POST /v1/chat/completions and POST /v1/responses (OpenAI), POST /v1/messages (Anthropic) and POST /v1beta/models/{model}:generateContent (Google Gemini), all under https://api.spicyapi.ai — so a client that already speaks one of those protocols only needs its base URL pointed at SpicyAPI. Use native jobs/stream when you need quote confirmation and the platform event envelope — see the chat streaming guide.

It cannot cancel an accepted task — no public API can — and it never answers a billing confirmation on your behalf.

More

Available Tools

15 tools
spicyapi_balance_getGet SpicyAPI USD balanceA
Read-onlyIdempotent

Return available, held, and total balance as exact decimal USD strings when requested or diagnosing funds. Task creation already checks funds; this is not a prerequisite.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, covering safety and repeatability. The description adds meaningful context beyond annotations: the exact decimal format of the returned strings, and the clarification that task creation does its own funds check. This helps the agent understand precision expectations and when calling is redundant. It doesn't mention rate limits or latency, but those are not expected for a simple balance query.

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

Conciseness5/5

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

The description is two concise sentences. The first sentence front-loads the primary purpose and output format; the second adds a critical usage note. No filler or redundancy. Every word contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with an output schema, the description fully covers what an agent needs to know: what is returned (three balance components in exact decimal strings), when to use it, and when not to. The output schema presumably details the structure, so the description doesn't need to. No critical information is missing.

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

Parameters4/5

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

The tool has zero parameters, so the baseline per guidelines is 4. The description correctly omits parameter details since there are none to explain. No value is lost from lack of parameter documentation.

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

Purpose5/5

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

The description explicitly states the tool's function: returns available, held, and total balance as exact decimal USD strings. The verb 'Return' plus resource 'balance' is specific, and it clearly distinguishes the purpose from sibling tools (none of which are balance-related). No ambiguity remains.

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

Usage Guidelines4/5

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

The description provides clear usage context: use when balance is requested or when diagnosing funds. It also explicitly states that this is not a prerequisite for task creation because task creation already checks funds, which prevents unnecessary calls. It doesn't name an alternative tool because none exists, but the exclusionary guidance is valuable.

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

spicyapi_download_url_createCreate a SpicyAPI output download URLA

Create a short-lived signed URL for an output owned by the current task and API key, for legacy integrations or explicit link renewal. Prefer existing ready output.assets[].url from task_get, task_wait, or a verified v2 webhook; no ticket call is needed for those links.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNo
taskIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations indicate this is not read-only and not destructive, and the description adds 'short-lived signed URL' and ownership context. However, it does not disclose expiration duration, whether creating the URL incurs costs or triggers a ticket, or any side effects. It also does not clarify whether calling this tool is itself a 'ticket call' – the mention of ticket calls is ambiguous. These gaps leave behavior partially unspecified beyond the annotations.

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

Conciseness5/5

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

Two sentences with no filler. The first sentence states the core purpose, and the second delivers usage guidance. Efficient, front-loaded, and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return format need not be covered. But the description omits explanation of the 'key' parameter, which is essential for selecting the right output, and leaves the ticket-call relationship vague. For a tool with only 2 params and clear guidance, it is adequate but not complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It implicitly references taskId ('owned by the current task') but never mentions the 'key' parameter, its purpose, or how to choose among multiple outputs. The description adds minimal meaning for taskId and none for key, leaving parameter semantics largely unexplained.

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

Purpose5/5

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

The description states a specific verb and resource: 'Create a short-lived signed URL for an output owned by the current task and API key.' It also distinguishes itself from sibling tools like task_get and task_wait by positioning itself as a fallback for 'legacy integrations or explicit link renewal,' making its unique role clear.

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

Usage Guidelines5/5

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

The description explicitly says when to use this tool ('for legacy integrations or explicit link renewal') and when not to ('Prefer existing ready output.assets[].url from task_get, task_wait, or a verified v2 webhook'). It names the alternatives and states no ticket call is needed for those links, giving clear routing guidance.

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

spicyapi_model_getGet one SpicyAPI modelA
Read-onlyIdempotent

Return one exact model, its live input schema, pricing, policy and availability. Reuse a complete record already obtained from models_list with includeSchema. The input schema is plain JSON Schema; display-only and rate-card annotations are removed. Some input values change the price; task_create obtains the exact request quote for confirmation. Use pricing entries for comparisons rather than calculating the accepted charge yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, and non-destructive behavior. The description adds that the input schema is plain JSON Schema with display-only and rate-card annotations removed, and that some input values change the price. This goes beyond annotations and gives actionable context about the data returned.

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

Conciseness5/5

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

Three sentences, front-loaded with the primary purpose, then usage and pricing caveats. Each sentence adds distinct value with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, and the description covers purpose, input source, and pricing behavior. It also routes to task_create for exact quotes, leaving no critical information missing for correct invocation.

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

Parameters3/5

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

The single 'model' parameter has no schema description (0% coverage). The description hints at how to populate it by referencing models_list ('Reuse a complete record already obtained from models_list'), but it does not explicitly state the expected format or that it is an identifier. This partially compensates but leaves room for clarity.

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

Purpose5/5

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

The description clearly states it returns one exact model with specific details (live input schema, pricing, policy, availability). It also distinguishes itself from models_list by instructing reuse of a record from that sibling, making the scope explicit.

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

Usage Guidelines5/5

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

Provides explicit guidance: reuse a record from models_list with includeSchema, and directs that task_create is for exact price quotes while this tool's pricing is for comparisons. This clearly informs when to use this tool versus alternatives.

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

spicyapi_models_listList callable SpicyAPI modelsA
Read-onlyIdempotent

Discover enabled models and account-specific prices. Fetch only the selected model for its schema, or set includeSchema to reuse complete records without another model_get call. Returned input schemas are plain JSON Schema; display-only and rate-card annotations are removed. Some input values change the price; task_create obtains the exact request quote for confirmation. Use pricing entries for comparisons rather than calculating the accepted charge yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskNo
searchNo
modalityNo
providerNo
includeSchemaNo
includeExamplesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond readOnly/idempotent annotations, it discloses that returned schemas are plain JSON Schema with display-only and rate-card annotations stripped, and that some input values can change the final price. This manages expectations about the data and cautions against using list pricing as the final charge.

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

Conciseness5/5

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

Four sentences, front-loaded with the core purpose and followed only by high-value caveats. No filler or repetition of annotation/schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The behavioral caveats and sibling routing are strong, but with six undocumented optional parameters and no parameter descriptions, an agent cannot fully determine how to select a single model or use filters. Basic model-list calls are covered, but deeper use requires inference.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must explain parameters, but it only explicitly covers includeSchema. The meaning of 'task' (how the 'selected model' is specified), search, modality, provider, and includeExamples is left to inference or the output schema.

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

Purpose5/5

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

States a concrete verb and resource: discover enabled models and account-specific prices. It differentiates itself from model_get by noting that includeSchema can avoid a separate model_get call.

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

Usage Guidelines5/5

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

Explicitly contrasts with model_get ('without another model_get call') and routes exact-price confirmation to task_create. It tells agents to treat pricing entries as comparative, not authoritative charges, which is clear when-to-use guidance.

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

spicyapi_service_statusCheck SpicyAPI service statusA
Read-onlyIdempotent

Read public health and readiness endpoints for diagnostics or an explicit status request. Not a prerequisite for task creation. No API key is required. Report the operational field. On the public surface /readyz answers 404 by design — readiness exposes database and Redis state, so it is registered only on the admin process — and operational already accounts for that. Do not report a 404 there as an outage.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark this as read-only and idempotent, and the description adds significant behavioral nuance: /readyz returns 404 by design on the public surface, readiness is registered only on the admin process, and 'operational' accounts for that. It also tells the agent not to report the 404 as an outage, which prevents a common misdiagnosis.

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

Conciseness5/5

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

Every sentence earns its place: the core function is front-loaded, followed by a clear usage caveat, an auth note, and a critical behavioral warning about 404 handling. The length is justified because it prevents a realistic false outage report.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema availableable and annotations covering the safety profile, the description supplies the remaining operational context an agent needs: what to report, how to interpret 404, and the readiness endpoint's admin-only nature. Nothing essential is missing for correct invocation and interpretation.

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

Parameters4/5

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

There are zero parameters and the schema is empty, so the baseline is 4. The description does not need to document parameter semantics; it instead clarifies the input-free nature by noting no API key is required, which is sufficient.

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

Purpose5/5

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

Description uses a specific verb ('Read') with a clear resource ('public health and readiness endpoints') and the intended use ('diagnostics or an explicit status request'). This clearly differentiates it from the sibling tools, which cover docs, models, balance, usage, and task operations.

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

Usage Guidelines5/5

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

The description states when to use the tool ('for diagnostics or an explicit status request') and explicitly gives a when-not ('Not a prerequisite for task creation'). It also adds operational context with 'No API key is required,' giving the agent enough to decide when this tool is appropriate.

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

spicyapi_task_createCreate a billable SpicyAPI taskA
Idempotent

Obtain the exact request quote, show its USD estimate and maximum charge for user confirmation, then reserve funds and create an asynchronous task. Do not call task_quote first unless independently comparing prices. The confirmation needs an MCP client that supports form elicitation; if the client does not, the call fails after the free quote and no task is created or charged.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYes
modelYes
callBackUrlNo
idempotencyKeyNo
retentionSecondsNoHow long SpicyAPI keeps this task's generated media, result payload, prompt and other input text, in seconds. Only ever shortens: the account settings and platform maximum still apply, so this cannot extend retention. 0 removes them as soon as the task reaches a terminal state. Set it only when the user asked for a shorter window; the accepted deadlines come back in the task record's retention field.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description reveals important billing and failure behavior: it obtains a quote, shows USD estimate and maximum charge, reserves funds, creates an async task, and fails after the free quote without charging if form elicitation is unsupported. There is no contradiction with the annotations, and the description adds substantial context that annotations alone do not provide.

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

Conciseness5/5

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

The description is three tightly written sentences with no filler. The primary workflow is front-loaded, and each sentence adds essential information: the creation flow, the task_quote exclusion, and the critical client-support failure condition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the full call sequence, the money-related implications, the alternative to avoid, and the failure mode, which is enough for an agent to invoke the tool correctly. Given the presence of an output schema and annotations, the absence of a detailed return-value explanation is acceptable.

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

Parameters2/5

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

Schema description coverage is only 20%, and the description does not compensate by explaining the remaining parameters. The schema's retentionSeconds is well documented, but model, input, callBackUrl, and idempotencyKey receive no added meaning from the description, leaving a significant semantic gap for a low-coverage schema.

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

Purpose5/5

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

The description states a specific process and resource: obtain an exact quote, show the USD estimate and maximum charge, reserve funds, and create an asynchronous task. It also explicitly distinguishes this from task_quote by instructing not to call task_quote first unless independently comparing prices, so an agent can select it correctly.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: the tool performs quote, confirmation, and creation in one flow, and the agent should not call task_quote first unless independently comparing prices. It also warns that the tool requires an MCP client supporting form elicitation, and if that support is absent the call fails after the quote with no charge.

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

spicyapi_task_getGet a SpicyAPI taskA
Read-onlyIdempotent

Read a task created by the current API key, including ready output.assets[].url links. Use those URLs directly without your API key; query again if assets are pending or URLs have expired. A verified complete v2 webhook already contains the result. Unknown and inaccessible IDs are both 404.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, idempotentHint, etc.), the description discloses critical behaviors: the assets URLs are directly usable without an API key, URLs may expire and require re-query, and unknown and inaccessible IDs both return 404. It also notes the webhook shortcut. No contradiction with annotations.

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

Conciseness5/5

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

Three sentences, each earning its place: the first states the core function, the second explains how to use the output URLs, and the third addresses webhook replacement and error behavior. It is front-loaded with the main purpose and contains no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one parameter, an output schema present, and rich annotations covering safety, the description addresses all operational needs: retry logic for pending/expired assets, the webhook alternative, and error handling (404 for any invalid ID). Nothing an agent needs to call the tool successfully is missing.

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

Parameters4/5

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

The sole parameter 'taskId' is not described in the schema (0% coverage), but the description adds essential meaning: it refers to a task created by the current API key, and that unknown or inaccessible IDs yield 404. While it doesn't specify how to obtain the taskId (e.g., from task_create or tasks_list), it gives enough context for correct usage, compensating well for the schema gap.

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

Purpose5/5

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

The description explicitly states 'Read a task created by the current API key' with a clear verb and resource, and adds a specific feature ('including ready output.assets[].url links') that distinguishes it from siblings like tasks_list (list tasks) and task_wait (wait for task). The purpose is unambiguous and separates it from alternatives.

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

Usage Guidelines4/5

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

The description provides usage context by noting 'A verified complete v2 webhook already contains the result,' implying when this tool is unnecessary, and advises to 'query again if assets are pending or URLs have expired,' giving retry guidance. It doesn't explicitly name sibling tools as alternatives, but the webhook alternative and retry conditions are clear enough for an agent to decide when to use it.

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

spicyapi_task_purgeDestroy a SpicyAPI task's stored contentA
DestructiveIdempotent

Permanently destroy one terminal task's stored content: generated media, result payload, prompt, and input text. This destroys content, not the record of what it cost — the ledger entry, charged amount, model, state, timestamps and request ID all stay queryable afterwards, so this never hides or reverses a charge and never refunds anything. It cannot be undone and there is no per-output granularity: the unit is one whole task. Download any result the user still wants before calling this. Only tasks in a terminal state are accepted. An accepted task cannot be canceled and there is no cancellation API, so for a queued or running task wait until it finishes (task_wait), then purge it. Repeating the call on an already destroyed task succeeds and changes nothing. Requires a user confirmation round.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdYesThe exact task whose content should be destroyed. Only call this for a task the user named; never sweep task history on your own initiative.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already signal destructive and idempotent behavior, but the description adds substantial context beyond them: charges remain queryable, no refund or reversal occurs, no per-output granularity, the operation is irreversible, repeat calls are no-ops, and user confirmation is required. This fully discloses the consequence profile an agent needs before invoking a destructive tool.

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

Conciseness5/5

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

The description is dense but every sentence carries a distinct operational fact: destruction scope, cost-record preservation, irreversibility, download warning, terminal-state precondition, waiting path, idempotence, and confirmation. The most critical safety information is front-loaded, and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with no cancellation path, this description is operationally complete: it states preconditions, exact effects, non-effects, idempotence, required confirmation, and the correct workflow via task_wait. The output schema exists, so not describing return values is acceptable.

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

Parameters4/5

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

The schema already covers taskId's format and the rule to only use a user-named task. The description adds further selection semantics by requiring a terminal state and clarifying that the scope is the whole task, not individual outputs. That goes slightly beyond the baseline for high schema coverage, though it does not describe the parameter format itself.

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

Purpose5/5

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

The description opens with a precise verb and resource: 'Permanently destroy one terminal task's stored content,' and enumerates exactly what is destroyed. It also distinguishes itself from sibling tools by clarifying that it does not touch cost records or cancel tasks, so there is no ambiguity against task_wait or task_retry.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use and when-not-to-use guidance: download wanted results first, only call on terminal tasks, wait with task_wait for queued/running tasks, and require user confirmation. It also states there is no cancellation API)Skip and no alternative for undoing, so the agent knows this is the only destructive path and how to sequence it correctly.

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

spicyapi_task_quoteQuote an exact SpicyAPI requestA
Read-onlyIdempotent

Compare an exact request price without creating a task or reserving funds. Returns a five-minute USD estimate and maximum charge. task_create already obtains its own quote and confirmation; do not call this tool as a routine prerequisite.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYes
modelYes
callBackUrlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already mark this as read-only, idempotent, and non-destructive, and the description adds further useful behavior: it creates no task, reserves no funds, and returns a five-minute USD estimate plus maximum charge. This goes beyond what annotations alone convey.

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

Conciseness5/5

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

Three short sentences, each earning its place: one states the core action, one states the returned data, and one prevents misuse. The most important differentiator is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the read-only annotations and presence of an output schema, the description covers the critical behavioral and usage context well. The main gap is parameter semantics, especially for the nested input object and optional callBackUrl, but the overall tool purpose remains clear enough for an agent to use correctly.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the full burden for parameter meaning, but it never mentions model, input, or callBackUrl. The phrase 'exact request price' hints that input represents the request, but the tool does not explicitly explain what each parameter is or how it shapes the quote.

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

Purpose5/5

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

The description states a specific action ('Compare an exact request price'), the resource (an exact SpicyAPI request), and key constraints ('without creating a task or reserving funds'). It clearly differentiates this from task_create and other task-related siblings.

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

Usage Guidelines5/5

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

The description explicitly tells the agent not to call this as a routine prerequisite because task_create already obtains its own quote and confirmation. It also implies the tool is for price comparison before deciding to create a task, giving clear usage context.

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

spicyapi_task_retryRetry a billable SpicyAPI taskA
Idempotent

Create a new task from a failed or expired source. Requires a user confirmation round.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdYes
idempotencyKeyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover read-only, idempotency, and destructive hints, so the bar is lower. The description adds valuable behavioral context beyond annotations: the operation is billable, requires a user confirmation round, and creates a new task rather than modifying the source. No contradiction with annotations exists.

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

Conciseness5/5

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

Two short sentences deliver the core action, trigger condition, and a critical prerequisite (user confirmation). Every word earns its place, and the essential purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema and rich annotations reduce the burden, but important invocation details remain missing: what taskId refers to, how the idempotency key should be used, and what 'requires a user confirmation round' means in practice for an agent workflow. This is adequate but has clear gaps.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the undocumented taskId and idempotencyKey parameters. It does not mention either parameter by name or explain idempotencyKey's role. The phrase 'from a failed or expired source' weakly implies taskId is the source task, but this is not explicit enough for an agent to invoke the tool with confidence.

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

Purpose5/5

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

The description states a specific action ('Create a new task') and a precise trigger condition ('from a failed or expired source'), making the tool's purpose clear and distinct from siblings like task_create or task_quote. The title adds the billable quality and confirms this is a retry path. The agent can confidently infer what this tool is for.

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

Usage Guidelines3/5

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

The description implies usage when a source task is failed or expired, and notes that a user confirmation round is required. However, it does not explicitly contrast with alternatives such as spicyapi_task_create for new tasks or spicyapi_task_get for inspection. The context is adequate but the exclusions are left to inference.

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

spicyapi_tasks_listList current SpicyAPI key tasksA
Read-onlyIdempotent

Discover current-key task history with metadata only, without fetching each result. Dates are UTC [from,to), default seven days, at most 92 days. Keep from/to fixed across pages and pass nextCursor unchanged. Limit defaults to 20, maximum 100. Cost is an exact USD string and is final only when settled. Use task_get only for selected results; use usage_get for settled spending including hidden tasks. This is not a polling endpoint or a prerequisite to generation.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNo
fromNo
limitNo
modelNo
stateNo
cursorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/idempotent/non-destructive behavior, and the description adds meaningful behavior beyond that: metadata-only responses, UTC half-open date intervals, defaults and maximums, stable cursor requirements, exact-but-settled cost semantics, and explicit non-polling/non-prerequisite characteristics. No contradiction with annotations.

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

Conciseness5/5

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

Every sentence carries a distinct, useful fact: scope, date semantics, pagination rules, limits, cost behavior, sibling routing, and exclusions. The core purpose is front-loaded, and the later caveats build context without repetition or padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema covers return shape and annotations cover safety/idempotency, the description supplies the remaining operational context: current-key scope, metadata-only behavior, date boundaries, cursor stability, limit defaults, cost finality, and clear exclusions. The only minor omission is explicit model/state filter semantics, but the schema names and enum mitigate that.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate. It adds concrete semantics for from/to (UTC, half-open interval, default/max), limit (default/max), and cursor (fixed across pages), but it does not explicitly explain the model or state filter parameters. The state enum is self-describing and model is inferable, but the description is not fully exhaustive.

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

Purpose5/5

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

The description identifies a specific verb and resource ('Discover current-key task history') and adds the crucial qualifier 'with metadata only, without fetching each result.' It also differentiates itself from task_get and usage_get, so an agent can distinguish it from siblings without opening schemas.

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

Usage Guidelines5/5

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

The description gives explicit routing guidance: use task_get only for selected results and usage_get for settled spending including hidden tasks. It also preempts misuse by stating this is not a polling endpoint or a prerequisite to generation, plus gives pagination and date-window instructions.

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

spicyapi_task_waitWait briefly for a SpicyAPI taskA
Read-onlyIdempotent

Wait for a task for up to 300 seconds and read ready output.assets[].url directly without a download-ticket call. By default, polling backs off from about 2 to at most 10 seconds; an explicit intervalSeconds stays fixed. Prefer signed webhooks for production; a complete verified v2 callback needs no extra task_get. A local wait timeout does not cancel the task.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdYes
timeoutSecondsNo
intervalSecondsNoFixed polling interval in seconds. Omit to use adaptive SDK backoff from about 2 to at most 10 seconds.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description reveals concrete behavior: adaptive backoff from about 2 to 10 seconds, fixed intervalSeconds when provided, direct URL access, and non-cancellation on local timeout. There is no contradiction with annotations.

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

Conciseness5/5

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

Four compact sentences, each carrying new information: primary behavior, polling details, production alternative, and timeout caveat. The most important action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Annotations and output schema cover safety and return shape, and the description covers polling, timeout, and alternatives. It does not explicitly state what the tool returns if the timeout elapses or the task fails, which is a notable edge case for a wait tool, but the remaining guidance is strong.

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

Parameters4/5

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

Schema coverage is only 33%, but the description compensates by defining timeout up to 300 seconds and explaining intervalSeconds' fixed versus adaptive behavior. It does not restate taskId, though that parameter is self-evident from the tool name and required field.

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

Purpose5/5

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

The first sentence names a specific action and resource: wait for a task for up to 300 seconds and read ready output.assets[].url directly. It also distinguishes itself from sibling download-ticket and task_get flows by noting that no download-ticket call is needed.

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

Usage Guidelines5/5

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

It gives explicit routing guidance: use this to poll and read output directly, skip the download-ticket call, prefer signed webhooks in production, and rely on a verified v2 callback rather than an extra task_get. The note that a local timeout does not cancel the task also tells the agent what not to assume after a timeout.

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

spicyapi_upload_fileUpload a local file to SpicyAPIA

Read a file from this computer, upload it, and return the spicy:// URI to put in a model input field. Use this whenever the user refers to a file on their machine. Images up to 10 MiB; MP4/WebM video and MP3/WAV audio up to 90 MiB. Public HTTPS media URLs need no upload at all — pass them straight to the model input when its schema accepts a URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path to the file on this computer, as the user gave it.
contentTypeNoOnly when the file extension is missing or wrong; otherwise inferred.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

The description adds meaningful behavioral details beyond annotations: file size limits (10 MiB images, 90 MiB video/audio), the act of reading from this computer, uploading, and returning a URI. It does not contradict the annotations and gives useful operational context.

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

Conciseness5/5

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

Four sentences, front-loaded with the core purpose, followed by when to use it, size limits, and the alternative. No filler or redundant restating of the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with an output schema present, the description covers the action, the result (spicy:// URI), size limits, supported media categories, and the key alternative. Nothing essential is missing for an agent to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds value by clarifying that 'path' is an absolute path as given by the user and that 'contentType' is only needed when the extension is missing or wrong. This goes beyond the schema's own parameter descriptions.

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

Purpose5/5

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

The description states a specific verb and resource: read a local file, upload it, and return a spicy:// URI. It clearly defines when the tool should be used ('whenever the user refers to a file on their machine') and distinguishes itself from the no-upload path for public HTTPS URLs.

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

Usage Guidelines5/5

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

Explicit guidance is given for when to use this tool versus passing URLs directly. It also defines the alternative ('Public HTTPS media URLs need no upload at all') and gives media-type/size constraints, making the selection decision unambiguous.

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

spicyapi_usage_getGet current SpicyAPI key usageA
Read-onlyIdempotent

Read task counts and settled actual USD spend for the current API key, grouped by creation day and model. Only from/to dates are accepted: UTC [from,to), at most 92 days; defaults to seven days ending tomorrow UTC. Money is returned as exact decimal strings; pending holds are excluded and late settlement can change prior-day spend. This is not account balance or remaining key budget, and is not a generation prerequisite. Use for requested usage reports; respect Retry-After on rate limits.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoExclusive UTC date, YYYY-MM-DD. Defaults to tomorrow UTC.
fromNoInclusive UTC date, YYYY-MM-DD. Defaults to seven days before to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and idempotentHint=true, but the description adds unique behavioral context: money is returned as exact decimal strings, pending holds are excluded, late settlement can change prior-day spend, and rate limits should respect Retry-After. These details go beyond annotations and help the agent understand the reliability and semantics of the data.

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

Conciseness5/5

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

Every sentence carries weight: purpose, constraints, return format, exclusions, boundary clarification, and usage guidance. The most critical information (what it does and what it is not) is front-loaded. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 optional parameters, read-only, idempotent) and that an output schema exists, the description covers all essential operational details: defaults, date range cap, return format, and exclusions. It is complete for an agent to call correctly.

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

Parameters4/5

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

Schema coverage is 100% (both parameters have descriptions), so the baseline is 3. The description adds interval semantics (UTC [from,to), at most 92 days, defaults) which is useful beyond the schema. It doesn't dive into each parameter individually, but the added context justifies a 4 rather than a baseline 3.

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

Purpose5/5

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

The description begins with a specific verb+resource: 'Read task counts and settled actual USD spend for the current API key, grouped by creation day and model.' It explicitly distinguishes itself from siblings by stating it is not account balance or remaining key budget, and not a generation prerequisite. This leaves no ambiguity about what the tool does.

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

Usage Guidelines5/5

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

The description gives explicit use case: 'Use for requested usage reports.' It also states what it is not (balance, budget, generation prerequisite), effectively telling the agent when not to use it. This is sufficient guidance for selecting between siblings like balance_get.

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.

  1. 15 tool updatesv0.4.5
    • First observedspicyapi_balance_get
    • First observedspicyapi_docs_search
    • First observedspicyapi_download_url_create
    • First observedspicyapi_model_get
    • First observedspicyapi_models_list
    • First observedspicyapi_service_status
    • First observedspicyapi_task_create
    • First observedspicyapi_task_get
    • First observedspicyapi_task_purge
    • First observedspicyapi_task_quote
    • First observedspicyapi_task_retry
    • First observedspicyapi_task_wait
    • First observedspicyapi_tasks_list
    • First observedspicyapi_upload_file
    • First observedspicyapi_usage_get

TDQS

A4.2/5.0

Scored across 15 tools

Disambiguation4/5

Most tools are clearly separated by resource (service, docs, models, balance, usage, tasks, files, URLs) and action. The only mild overlap is task_get vs task_wait vs download_url_create, but their descriptions distinguish reading a task, waiting for completion, and creating a signed URL.

Naming Consistency4/5

The naming follows a consistent spicyapi_<resource>_<action> pattern, e.g. models_list, model_get, task_create, task_get. Minor deviation: download_url_create uses a noun phrase (download_url) rather than a resource noun like url, but it is still readable and predictable.

Tool Count5/5

15 tools is at the upper end of the ideal range but each tool maps to a distinct operation in the API lifecycle: service status, docs, models, balance, usage, task CRUD/wait/retry/purge, upload, download, and quote. No tool feels redundant.

Completeness4/5

The surface covers the full task lifecycle: quote, create, get, wait, retry, purge, plus upload/download and account management. Minor gaps: no explicit task cancellation (documented as unavailable) and no webhook management tool, but the descriptions explain workarounds.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Provides AI assistants with access to Civitai's collection of AI models, enabling users to browse, search, and discover AI models through MCP-compatible AI assistants.
    2
    14
    12
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    Provides AI assistants with real-time access to 1000+ AI models including their latest pricing, context windows, capabilities, and specifications. Supports model search, comparison, recommendations, and live testing.
    3
    54 npm
    1
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables discovery of public AI models with pricing, documentation context, and OpenAI-compatible integration examples. Supports both read-only queries and paid async media generation tasks.
    -