APIKO MCP
APIKO MCP server
Use APIKO image and video models from Claude Code and Codex. The server runs locally over stdio with your own APIKO API key: the agent can look up models and request fields, quote a list price, generate images and videos, follow tasks, check what the key has spent, and upload reference images.
Generation is billed to your APIKO balance at API prices. The server tells the agent to quote first and wait for your approval before every paid call.
Requirements
Node.js 18.17 or newer
An APIKO API key from https://apiko.app/dashboard/apikeys
Related MCP server: APIAny MCP Server
Install
The server is published on npm as apiko-mcp
and runs with npx -y apiko-mcp. To run it from source instead:
git clone <this repo> apiko-mcp
cd apiko-mcp
npm install
npm run build # writes dist/index.jsand replace npx -y apiko-mcp below with
node /absolute/path/to/apiko-mcp/dist/index.js.
Claude Code (CLI and desktop app)
claude mcp add apiko --scope user -e APIKO_API_KEY=sk-... -- npx -y apiko-mcp--scope user stores the server in ~/.claude.json, which the Claude Code
desktop app (Code tab) also loads. Run /mcp in Claude Code to check that
apiko is connected.
Codex (CLI, IDE extension, desktop app)
codex mcp add apiko --env APIKO_API_KEY=sk-... -- npx -y apiko-mcpor add this to ~/.codex/config.toml, which the Codex CLI, the IDE extension
and the ChatGPT desktop app share:
[mcp_servers.apiko]
command = "npx"
args = ["-y", "apiko-mcp"]
env = { APIKO_API_KEY = "sk-..." }If a desktop app reports that node or npx cannot be found, use the full
path from which node.
Try it without spending anything
Add APIKO_MCP_READ_ONLY=1 to the server's env (-e APIKO_MCP_READ_ONLY=1 or
--env APIKO_MCP_READ_ONLY=1). The generate and upload tools are then hidden;
model lookup, quotes, task checks and the key's usage still work.
Environment variables
Variable | Default | Meaning |
| required | Your APIKO key. Never paste it into a chat. |
| off |
|
|
| API base URL. |
|
| Where the public price catalog is read from. |
| unset | Used only when set. Node's built-in fetch ignores them, so the server switches to a proxy-aware client when they are present. |
Tools
Tool | Cost | What it does |
| free | Lists the models your key can use, with category, list price and modes. Filter by |
| free | One model's |
| free | Validates an input against the schema and quotes the list price without submitting. |
| paid | Generates, or edits when |
| paid | Submits a video task ( |
| free | Status, progress, result URLs and failure reason of a task; can wait up to 45 s. |
| free | What this key has spent and its own spending limit, if any. |
| free | Uploads a local JPEG/PNG/WebP (or copies a public image URL) and returns a public |
Typical flow: search_models → get_model → upload_image (if you have local
references) → estimate_cost → you approve → generate_image /
generate_video → get_task.
Cost estimates
estimate_cost (and the generate tools' cost field) returns one of:
estimated: a number, when the price follows directly from the input: per-image tiers chosen byresolution(or by an explicitWxHsize forgpt-image-2), flat per-image prices, and per-second video prices byresolution×duration, including reference videos once you passreference_video_seconds.needs_input: something the price depends on is missing, usually the total length of reference videos. You also get the range and the amount held from your balance at submission (hold_usd), which is refunded down to the real charge when the task settles.token_billed: billed by tokens (GPT Image 2.5 Flare / Sunburst, text models). Anindicative_usdfigure may be shown, but it is not a quote.unknown: no published price or no reliable rule; never treat it as free.
All figures are list prices in USD from the public catalog at apiko.app. The gateway's charge at settlement is final. Failed tasks are refunded automatically.
max_cost_usd on the generate tools refuses the call when the estimate, or its
guaranteed upper bound, is above the cap, or when no reliable figure exists.
Billing notes
Each
generate_*call creates a paid task. Calling it again to check progress would pay twice; useget_task.client_request_idstops a repeated call from being submitted twice while the same server process is running. If a submission times out, the server does not retry it: check https://apiko.app/dashboard/usage first.Result links are signed and kept for 24 hours. Uploaded references are public to anyone with the link and are deleted after 72 hours.
check_balancereads the key, not the account. Keys created on apiko.app have no limit of their own and draw on the account balance, which only the dashboard shows (https://apiko.app/dashboard/billing).Text models appear in
search_models, but you call them through the OpenAI-compatible API athttps://api.apiko.app/v1, not through this server.
Timeouts
Codex gives each MCP tool call 60 seconds by default, so no tool here waits
longer than 45 seconds; long tasks are followed with get_task. The rare
sync-only image model can take longer: raise tool_timeout_sec under
[mcp_servers.apiko] if you use one.
Development
npm install
npm test # builds, then runs the tests against a local mock APIsrc/tools.ts holds the tool logic and src/server.ts builds an McpServer
from it, independent of the transport; src/index.ts is the stdio entry point.
The tests never call the production API.
Available Tools
8 toolscheck_balanceCheck key limit and usageARead-onlyIdempotent
Show what this API key has spent and its own spending limit, if it has one. Free. Keys without a limit draw on the account balance, which API keys cannot read; the user sees it at https://apiko.app/dashboard/billing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so the bar is lower. The description still adds real value beyond them: it states the call is free and discloses a hard limitation (API keys cannot read the account balance) that no annotation covers.
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, front-loaded with what is returned, then cost, then the limitation and fallback. The dashboard URL earns its place by telling the agent what to tell a user who needs the account balance.
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?
There is no output schema, so the description must carry the return-value burden, and it names the two returned concepts (spent amount and limit). It is slightly vague on what happens in the no-limit case (null vs. absent) but is otherwise complete for a zero-argument read.
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 takes zero parameters, so the baseline is 4. Nothing in the description misrepresents the input surface, and the absence of arguments is consistent with a simple key-scoped lookup.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: shows what the API key has spent and its own spending limit. It also scopes the answer precisely by ruling out the account balance, which is the main ambiguity for a balance-checking tool. Sibling names are unrelated resources, so sibling differentiation is not a meaningful test here.
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 clear context for when the result is sufficient versus insufficient: keys without a limit draw on the account balance, which this tool cannot read, with a URL where the user can see it. That is a genuine conditional routing instruction, though it stops short of explicit 'use this when' phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_costEstimate generation costARead-onlyIdempotent
Validate a planned input against the model schema and quote its list price without submitting anything. Free. status "estimated" gives a number; "needs_input" names what is missing (e.g. reference_video_seconds); "token_billed" and "unknown" mean no reliable number exists, so never present them as a price. Show the user the model, input and estimate and wait for explicit approval before calling generate_image or generate_video.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No | Model request fields exactly as listed in get_model input_schema (e.g. {"prompt": "...", "resolution": "2k"}). Leave out model and async. | |
| model | Yes | ||
| reference_video_seconds | No | Total length in seconds of all reference_videos, when the input has any; used only for the estimate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it declares the call is free, that nothing is submitted, and enumerates the four status outcomes with a strong instruction never to present token_billed or unknown as a price. That is exactly the behavioral context the annotations cannot carry.
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 purpose, then the status semantics, then the approval gate. Every clause carries operational weight; nothing is 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?
There is no output schema, and the description compensates by explaining what each returned status means and how to present the result. Combined with the mutation-adjacent workflow (approval before generation), an agent has everything needed to call and interpret 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 67% and the description reinforces the key semantic that 'input' is the model request fields without model/async, plus it flags reference_video_seconds as the typical missing field behind needs_input. It does not add much about the 'model' parameter, but that parameter is self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair and resource: validate a planned input and quote list price, explicitly 'without submitting anything'. This distinguishes it cleanly from the sibling generation tools (generate_image, generate_video) and from get_model.
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?
Gives explicit when-to-use (before calling generate_image or generate_video), a required protocol step (show model, input and estimate, then wait for explicit approval), and a when-not-to-use implication (it does not submit). No alternative is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_imageGenerate or edit an image (billable)A
BILLABLE: creates a paid image task charged to the user's APIKO balance. Only call after estimate_cost on the same input and the user's explicit approval of the model and cost. With reference images in input.images it edits (POST /v1/images/edits), otherwise it generates. The input is validated against the model schema first. Runs async when the model supports it and waits up to wait_seconds; if not done, poll with get_task. Never call again to check progress.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No | Model request fields exactly as listed in get_model input_schema (e.g. {"prompt": "...", "resolution": "2k"}). Leave out model and async. | |
| model | Yes | Exact image model id. | |
| prompt | No | Shortcut for input.prompt; give the prompt once. | |
| max_cost_usd | No | Budget the user approved; the call is refused if the estimate (or its upper bound) is higher or cannot be computed. | |
| wait_seconds | No | Seconds to wait for the result (default 30). | |
| client_request_id | No | Your id for this one approved request (8-96 chars of letters, digits, . _ -). Reusing it with the same input returns the earlier task instead of charging twice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give readOnlyHint=false and openWorldHint=true, but the description adds the crucial non-obvious traits: it is billable against the user's balance, input is validated against the model schema before any charge, execution is async with a bounded wait, and re-invocation is not the progress-check path. These are behaviors an agent could not infer from 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?
The billing warning is front-loaded and every sentence carries an operative rule, but the paragraph is dense and stacks approval, routing, validation, async, and polling rules into one block. Slight structural cost, no wasted 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?
For a billable, async, branchy tool with six parameters, nested input, no output schema, and non-idempotent annotations, the description covers the spend guardrails, execution mode, wait/poll handoff, and duplicate-charge avoidance. Nothing an agent needs in order to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema only implies: input.images as the switch that routes to the edit endpoint, and wait_seconds as the boundary after which the agent must switch to get_task. The billing implications of model and max_cost_usd are reinforced by the 'approved model and cost' precondition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (creates a paid image task) and further specifies the two modes: edit when input.images is present, generate otherwise, with the underlying endpoints named. This separates it cleanly from estimate_cost, get_task, and generate_video in the sibling list.
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 preconditions (call only after estimate_cost on the same input and explicit user approval of model and cost), explicit edit-vs-generate branch, and an explicit exclusion: 'Never call again to check progress' with get_task named as the polling alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_videoGenerate a video (billable)A
BILLABLE: creates a paid video task (POST /v1/videos) charged per second to the user's APIKO balance. Only call after estimate_cost on the same input and the user's explicit approval of the model, duration, resolution and cost. Reference videos add billed seconds. Returns a task_id at once; poll with get_task (videos take minutes). Never call again to check progress.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No | Model request fields exactly as listed in get_model input_schema (e.g. {"prompt": "...", "resolution": "2k"}). Leave out model and async. | |
| model | Yes | Exact video model id. | |
| prompt | No | Shortcut for input.prompt; give the prompt once. | |
| max_cost_usd | No | Budget the user approved; the call is refused if the estimate (or its upper bound) is higher or cannot be computed. | |
| wait_seconds | No | Seconds to wait (default 0; videos take minutes, use get_task). | |
| client_request_id | No | Your id for this one approved request (8-96 chars of letters, digits, . _ -). Reusing it with the same input returns the earlier task instead of charging twice. | |
| reference_video_seconds | No | Total reference video length, for the cost check only; not sent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic profile (not read-only, open-world, non-idempotent); the description adds the operational facts an agent cannot infer: async semantics (returns task_id at once, minutes-long runtime), per-second billing including extra billed seconds for reference videos, and the approval gate. The client_request_id dedup note is consistent with idempotentHint=false rather than contradicting it.
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?
Five short sentences, front-loaded with BILLABLE and the endpoint, then the precondition, then the async/polling behavior. No filler and no repetition of the 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 7-param, nested-object, billable async tool with no output schema, the description covers cost model, approval prerequisite, return shape (task_id), and the correct follow-up tool. An agent has everything needed to call it safely once.
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%, so the baseline is 3. The description still contributes cross-parameter semantics – that reference videos 'add billed seconds' and that model/duration/resolution/cost must have been approved – which links max_cost_usd and reference_video_seconds to the billing decision rather than restating their schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('creates a paid video task') plus the endpoint (POST /v1/videos) and the billing basis (charged per second). The word 'video' plus the cost framing separates it cleanly from generate_image and the read-only 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?
Explicit preconditions: 'Only call after estimate_cost on the same input and the user's explicit approval of the model, duration, resolution and cost.' It also names the alternative for the follow-up step ('poll with get_task') and states a negative rule ('Never call again to check progress').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_modelGet APIKO model detailsARead-onlyIdempotent
Read one model's request fields (input_schema: types, enums, defaults, required fields), endpoints, async/sync modes and price tiers. Free. Send only fields from input_schema to estimate_cost and the generate tools.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Exact model id from search_models. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuine beyond-schema context: the call is 'Free' (no billing impact) and the returned input_schema is authoritative for what other tools accept — a real behavioral constraint, though error behavior for a bad model id is unstated.
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 dense sentences, zero filler. The payload enumeration comes first and the downstream routing instruction second, which is the right order for an agent deciding whether to call it.
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?
There is no output schema, so the description must describe returns — it does so field-by-field (request fields, endpoints, async/sync, price tiers), which is sufficient. Missing only failure-mode detail, e.g. what happens when the model id doesn't resolve.
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?
Only one parameter and schema description coverage is 100% — the schema already says 'Exact model id from search_models'. The description adds nothing about the model id format or how to recover from an invalid id, so it sits at the high-coverage baseline of 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?
States a specific verb and resource ('Read one model's ...') and enumerates the payload precisely (input_schema types/enums/defaults/required, endpoints, async/sync modes, price tiers), so the agent knows exactly what comes back. The singular 'one model' implicitly separates it from the sibling search_models list tool, but no sibling is named outright.
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?
Clear workflow context: 'Send only fields from input_schema to estimate_cost and the generate tools' tells the agent this is the prerequisite lookup step for the cost and generation siblings. It never states when *not* to call it or names search_models as the alternative for discovery, so the exclusion side is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskGet task status and resultsARead-onlyIdempotent
Read an image or video task: status (queued, in_progress, completed, failed), progress, result_urls and fail_reason. Free. wait_seconds (0-45, default 30) keeps polling until the task finishes or the time runs out. Failed tasks are refunded automatically. Result links last 24 hours.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | task_id returned by generate_image or generate_video. | |
| wait_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (readOnlyHint, idempotentHint), which only establish that this is a safe repeatable read. The description adds cost ('Free'), failure handling ('Failed tasks are refunded automatically'), and a 24-hour retention limit on result links — exactly the operational facts an agent needs beyond the schema.
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?
Five short sentences with no filler. The return payload is front-loaded, followed by cost, polling semantics, failure/refund behavior, and link expiry — each sentence carries distinct, actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values, and it does so explicitly (status states, progress, result_urls, fail_reason). Combined with the timeout and link-expiry behavior, an agent can call and interpret this tool correctly with nothing missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, and the undocumented parameter is wait_seconds; the description fully compensates by supplying the semantic range (0-45), the default (30), and the behavior (keeps polling until finished or timeout). It also frames task_id's provenance ('returned by generate_image or generate_video') via the 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 specific verb and resource ('Read an image or video task') and enumerates exactly what is returned (status, progress, result_urls, fail_reason). This is plainly distinct from the sibling generators (generate_image/generate_video) and account tools (check_balance) without ambiguity.
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?
Gives clear operating context: the tool is free, pollable via wait_seconds, and result links expire after 24 hours, which tells the agent it must fetch results promptly. It stops short of explicitly saying 'call this after generate_image/generate_video' or naming when-not-to-call, so it is strong context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_modelsSearch APIKO modelsARead-onlyIdempotent
List the APIKO models this API key can use, with category (image / video / chat), list prices and generation modes. Free. Use it before get_model; never guess model ids. Text models are listed for reference: call them with the OpenAI-compatible API, not through this server.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 20. | |
| query | No | Words that must all appear in the id, name or provider, e.g. "seedance" or "banana 2.1". | |
| category | No | Default "all". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely non-redundant context: the results are scoped to the calling API key, the call is free, and text models are not invocable through this server. It stops short of describing result ordering or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, and the highest-value instruction ('use it before get_model') is front-loaded alongside the purpose. Every clause carries information the agent acts on.
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?
No output schema exists, and the description compensates by naming the returned fields (category, list prices, generation modes). Combined with annotations covering safety, an agent has enough to call this correctly; only minor operational details like result ordering or total-count behavior are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: limit, query and category are all documented, including the category enum and defaults. The description only echoes the category values ('image / video / chat') and adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list APIKO models usable by this API key) and enumerates the returned fields: category, list prices, generation modes. It is clearly distinguished from sibling get_model, which the description explicitly positions as the follow-up step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing ('Use it before get_model; never guess model ids') and an explicit exclusion (text models are listed for reference only and must be called via the OpenAI-compatible API, not this server). That is exactly the when/when-not/alternative coverage an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageUpload a reference imageA
Upload a JPEG, PNG or WebP (up to 10 MB) and get a public https://img.apiko.app URL for reference fields such as images, first_image_url or reference_image_urls. Free (per key: 60 per minute, 1,000 per day). Give exactly one of path (a local file the user named) or url. The uploaded copy is public to anyone with the link and deleted after 72 hours, so only upload files the user asked to use.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public http(s) image URL to copy. | |
| path | No | Local file path (absolute, ~/..., or relative to the server's working directory). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: per-key rate limits (60/min, 1,000/day), public visibility of the uploaded copy, 72-hour automatic deletion, and the user-consent constraint. These are exactly the side effects an agent needs to judge before calling a non-idempotent write.
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 dense sentences, front-loaded with capability and return value, then constraints, then cost/limits, then safety caveat. No filler and nothing repeated from the 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?
Covers formats, size limit, return value (compensating for the absent output schema), the either/or input rule, rate limits, retention, and privacy. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds the mutual-exclusion rule (exactly one of path or url) that the schema cannot express given zero required parameters and no oneOf. The parenthetical 'a local file the user named' also adds consent semantics to path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (upload an image), names accepted formats and the 10 MB cap, and specifies the output (a public https://img.apiko.app URL). It also names the destination reference fields, which clearly separates it from siblings like generate_image or generate_video.
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?
Gives concrete conditions: supply exactly one of path or url, and only upload files the user explicitly asked to use. It implies the context (populating reference fields) but never names an alternative tool such as generate_image, so the when-not is only partially covered.
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.
8 tool updates
v0.1.1- First observed
check_balance - First observed
estimate_cost - First observed
generate_image - First observed
generate_video - First observed
get_model - First observed
get_task - First observed
search_models - First observed
upload_image
TDQS
Scored across 8 tools
Each tool targets a distinct step in the workflow: discovery (search_models vs get_model), quoting (estimate_cost), billable creation (generate_image vs generate_video), polling (get_task), asset upload, and balance. Descriptions explicitly fence off overlap, e.g. 'never call generate again to check progress' and 'use search_models before get_model'.
Uniform snake_case verb_noun pattern across all eight tools (check_balance, search_models, get_model, estimate_cost, generate_image, generate_video, get_task, upload_image). Verbs are used consistently with their intent (get for single reads, search for listing).
Eight tools is well-scoped for a media generation API: each maps to a necessary stage (discover, inspect, quote, generate, poll, upload, balance) with no redundant entries. Nothing feels padded or missing at the count level.
The surface covers the full paid-generation lifecycle including cost safety, asset upload, and async polling, and result links are returned. Minor gaps: no task listing or cancellation tool, and text/chat is deliberately out of scope (deferred to the OpenAI-compatible API), which agents can work around but leaves a small hole.
Maintenance
Related MCP Connectors
Generate images from Claude, ChatGPT, Cursor and Codex with 12 top AI image models. Up to 4 images per call, SVG vectorization, background removal, upscaling and image-to-video. Remote MCP with OAuth, no API keys.
- Flux AIOAuthart.fluxaipro
Generate images, videos and music with model discovery, cost estimates and asynchronous results.
Generate and edit images, create videos, quote credit costs, and retrieve private results.
- EvoLinkOAuthai.evolink
150+ image, video and audio models. Quote before you generate; pay as you go.
Related MCP Servers
- AlicenseBqualityDmaintenanceIntegrates MuAPI with Claude Code to enable image and video generation, editing, model discovery, and prediction tracking through natural language commands.9116 npm4MIT
- AlicenseBqualityCmaintenanceProvides tools for discovering AI models, checking pricing, retrieving API documentation context, and generating integration examples; also supports paid async image/video tasks.1041 npmMIT
- AlicenseAqualityBmaintenanceConnects Claude Code to image generation models (OpenAI GPT Image 2, Google Nano Banana) for generating, editing, and converting images via natural language.638 npmMIT
- AlicenseNot gradedqualityDmaintenanceGenerate AI images and videos from Claude, Cursor or any MCP client: 48+ models on one account (Flux 2, Nano Banana 2, Seedream 5, Kling V3, Seedance 2.5, Veo 3.1), with the exact cost in credits returned on every call.1MIT