spicyapi-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@spicyapi-mcpCompare video generation prices for a 5-second clip."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@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:
finds a suitable model in the live catalog and reads what it accepts;
uploads your local file if there is one;
gets an exact USD quote and stops to ask you before anything is charged;
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).npxships 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
Create an account at spicyapi.ai/register — if sign-ups are paused, that page shows how to join the waitlist.
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
0for no cap.Copy the key. It starts with
sk-spicy-and is shown once.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 keyIn 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
Open Settings → Developer → Edit Config. The file is
~/Library/Application Support/Claude/claude_desktop_config.jsonon macOS and%APPDATA%\Claude\claude_desktop_config.jsonon Windows.Paste the block below (or add the
spicyapientry to an existingmcpServers) and replaceYOUR_SPICY_API_KEY.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-mcpThe 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-mcpThat 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:
"Check the SpicyAPI service status." —
spicyapi_service_statusneeds no key, so this proves the server starts."What is my SpicyAPI balance?" —
spicyapi_balance_getproves the key reaches the server."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 |
| Public health and readiness; no key needed | Yes | No | No |
| Search the bundled first-party documentation index; no key | Yes | No | No |
| Enabled models and account-specific prices | Yes | No | No |
| One model and its current input schema | Yes | No | No |
| Available, held and total balance | Yes | No | No |
| Settled USD usage for the current key | Yes | No | No |
| One page of task metadata for the current key | Yes | No | No |
| Read one task, including ready result links | Yes | No | No |
| Wait up to 300 seconds for a task to reach a terminal state | Yes | No | No |
| Price an exact request without creating anything | Yes | No | No |
| Read, upload and commit a local file; return its | No | No | No |
| Short-lived signed URL for a task output | No | No | No |
| Create an asynchronous generation task | No | Yes | Always |
| Create a new task from a failed or expired one | No | Yes | Always |
| Destroy one terminal task's stored content ( | 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) |
| none |
|
|
|
|
|
|
| none |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 argumentsand 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 isno 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 inno 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_quotefirst 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_createagain with thatidempotencyKeyand 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 defaulttois tomorrow UTC andfromis seven days earlier.Task counts are grouped by creation day and model.
totalSpendand eachspendare 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-Afterwhen 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 |
| both entrypoints | Your API key. Required for everything except status and docs search |
| both entrypoints | Directories |
|
| Required bearer token, at least 32 bytes, different from |
|
|
|
|
| Port, default |
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/mcpThe MCP endpoint is
/mcpand requiresAuthorization: Bearer <SPICY_MCP_HTTP_TOKEN>; without it the server answers401.GET /healthzreturns{"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 |
| Install Node.js from nodejs.org, or use the absolute path from |
| Add |
| The key is not reaching the server: fix the |
| Key mistyped, revoked or expired — create a new key |
| Top up; raise the key's cap or wait for the UTC reset; allow the model on the key |
| The uploaded bytes do not match their ticket; call |
| 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 |
| A dependency is briefly unavailable; wait for |
| A synchronous generation failed upstream and was already refunded; sending the same request again is safe |
| 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 |
| The request changed after the question was asked; start the creation again |
| Quote expired or price changed; quote and confirm again |
| Give the full path; check it exists; move the file under an allowed root |
| Rename the file with a listed extension, or pass |
| The confirmation was declined or cancelled; the message says whether only the free quote had been requested |
| 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
Want the agent to also know the correct workflow? Add
@spicyapi/skill.
Available Tools
15 toolsspicyapi_balance_getGet SpicyAPI USD balanceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_docs_searchSearch SpicyAPI documentationARead-onlyIdempotent
Search the bundled index of verified first-party documentation URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, not destructive). The description adds valuable scope context: it is limited to a 'bundled index' and 'verified first-party' URLs, indicating a closed-world search rather than open web search. This is useful behavioral information beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no waste. It immediately states the verb and the resource, making it highly scannable and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and has an output schema that presumably covers return values. However, the description omits any detail about how to use the parameters or what the search scope entails beyond 'bundled index'. While not critical for a basic search tool, the lack of parameter explanation and any edge-case notes makes it slightly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It does not mention 'query' or 'limit' at all. While the parameters are relatively simple, the description provides no meaning beyond the schema's type/default information, failing to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Search') applied to a specific resource ('the bundled index of verified first-party documentation URLs'). It distinguishes the tool from siblings like service status, model listing, or task management, making it unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of alternatives or conditions that would make this tool the preferred choice. The description only states what it does, leaving the agent to infer usage context.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| taskId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 modelARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 modelsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | ||
| search | No | ||
| modality | No | ||
| provider | No | ||
| includeSchema | No | ||
| includeExamples | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 taskAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| model | Yes | ||
| callBackUrl | No | ||
| idempotencyKey | No | ||
| retentionSeconds | No | How 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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 taskARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 contentADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | The 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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 requestARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| model | Yes | ||
| callBackUrl | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 taskAIdempotent
Create a new task from a failed or expired source. Requires a user confirmation round.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | ||
| idempotencyKey | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 tasksARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| from | No | ||
| limit | No | ||
| model | No | ||
| state | No | ||
| cursor | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 taskARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | ||
| timeoutSeconds | No | ||
| intervalSeconds | No | Fixed polling interval in seconds. Omit to use adaptive SDK backoff from about 2 to at most 10 seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to the file on this computer, as the user gave it. | |
| contentType | No | Only when the file extension is missing or wrong; otherwise inferred. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 usageARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Exclusive UTC date, YYYY-MM-DD. Defaults to tomorrow UTC. | |
| from | No | Inclusive UTC date, YYYY-MM-DD. Defaults to seven days before to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
15 tool updates
v0.4.5- First observed
spicyapi_balance_get - First observed
spicyapi_docs_search - First observed
spicyapi_download_url_create - First observed
spicyapi_model_get - First observed
spicyapi_models_list - First observed
spicyapi_service_status - First observed
spicyapi_task_create - First observed
spicyapi_task_get - First observed
spicyapi_task_purge - First observed
spicyapi_task_quote - First observed
spicyapi_task_retry - First observed
spicyapi_task_wait - First observed
spicyapi_tasks_list - First observed
spicyapi_upload_file - First observed
spicyapi_usage_get
TDQS
Scored across 15 tools
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.
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.
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.
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
Related MCP Connectors
AI-agent product catalog: search, lookup & purchase routing over verified merchant data.
Directory of APIs, merchants, and tools AI agents can actually use.
- Kyma APIOAuthcom.kymaapi
Live model catalog with prices and measured uptime, rankings, credits and spend, spend-capped chat.
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Related MCP Servers
- AlicenseBqualityCmaintenanceProvides 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.21412MIT
- AlicenseAqualityFmaintenanceProvides 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.354 npm1MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to query hundreds of models across OpenAI, Google, and OpenRouter, with model discovery, deep-research jobs, and image generation.103MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables 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.-