Skip to main content
Glama
dnshtm9

kenari-media-mcp

by dnshtm9

kenari-media-mcp

An MCP (Model Context Protocol) server for the Kenari.id media APIs (https://kenari.id/v1). It gives any MCP client (Claude Desktop, Cursor, OpenCode, etc.) 8 tools for image generation and editing plus video generation, extension, status polling, and download. It runs over stdio and is designed for agentic use: all generated media is written to disk under a configurable output directory and returned as absolute file paths — never base64 or ImageContent — so the calling agent can open, move, or post-process files directly.

This project fills a gap: Kenari's own official MCP server covers docs, balance, and search, but not the media generation endpoints. This is a third-party, unaffiliated implementation for those endpoints.

⚠️ Cost warning — real money

Generation endpoints spend real Indonesian Rupiah (IDR) per call, billed to your Kenari account. Prices vary per model — gpt-image-2 is roughly 175 IDR per image, while others cost several times more. Treat the catalog prices you see via list_media_models as examples only; live prices come from list_media_models.

Note that preview does not save money — files are always written to disk regardless.

Never point automated tests or scheduled jobs at generation tools; the test suite uses a mocked fetch and spends nothing.

Related MCP server: Agnes AI MCP Server

Requirements

  • Node.js >= 20 (engines field is enforced; node --version to check)

  • pnpm (or npm) for installing and running scripts

  • A Kenari API key (kn-...), obtained from the Kenari dashboard. Required for everything except list_media_models (GET /v1/models is public).

Install from source

This is the primary installation path until the package is published to npm (it is not on npm yet — npx will not work yet).

git clone https://github.com/dnshtm9/kenari-media-mcp.git
cd kenari-media-mcp
pnpm install
pnpm build

The build writes the server entry to dist/index.js (the bin is kenari-media-mcp).

Environment variables

Var

Default

Notes

KENARI_API_KEY

(none)

Required for everything except list_media_models.

KENARI_BASE_URL

https://kenari.id/v1

Trailing slashes trimmed.

KENARI_OUTPUT_DIR

./kenari-output

Media save directory (created recursively). Absolute paths are returned.

KENARI_ALLOW_VIDEO

allow

Set to 0/false to disable all video tools with a clear error.

KENARI_MAX_IMAGE_N

4

Preflight cap for n.

KENARI_MAX_VIDEO_DURATION

15

Preflight cap for duration (seconds).

KENARI_MAX_COST_IDR_PER_CALL

(none)

Optional per-call IDR ceiling (image tools; best-effort catalog lookup).

.env files — important caveat

The repository includes a .env.example. Copy it to .env if you want pnpm start (or other local runs) to pick up defaults — pnpm start loads .env via a small built-in reader; existing environment variables always win.

MCP clients do not reliably load .env. When a client spawns this server, the server's working directory is often not the repository, so any .env next to it may be invisible. You must inject environment variables in the client JSON env block. Treat .env as a local-run convenience only.

Never commit .env or any file containing your API key.

MCP client configuration

Point the client at the built server. Most MCP clients require an absolute path in args — relative paths are resolved against the client's own working directory, not yours.

Substitute the location where you cloned the repository. On Windows, double every backslash in JSON strings and save the config file as UTF-8 without BOM (e.g. VS Code → "Save with Encoding → UTF-8"); a BOM can break config parsing.

Windows pattern:

{
  "mcpServers": {
    "kenari-media": {
      "command": "node",
      "args": ["C:\\\\path\\\\to\\\\kenari-media-mcp\\\\dist\\\\index.js"],
      "env": {
        "KENARI_API_KEY": "kn-REPLACE_ME",
        "KENARI_OUTPUT_DIR": "C:\\\\path\\\\to\\\\kenari-output"
      }
    }
  }
}

macOS / Linux pattern:

{
  "mcpServers": {
    "kenari-media": {
      "command": "node",
      "args": ["/path/to/kenari-media-mcp/dist/index.js"],
      "env": {
        "KENARI_API_KEY": "kn-REPLACE_ME",
        "KENARI_OUTPUT_DIR": "/path/to/kenari-output"
      }
    }
  }
}

KENARI_OUTPUT_DIR is any directory you choose; if you omit it, media is saved to ./kenari-output relative to the server's working directory (which may not be where you expect — setting it explicitly is safer).

After npm publish: npx (not yet possible)

The package is not published to npm yet, so the following does not work today. Once it is published, npx-based config will be:

Unix / macOS:

{
  "mcpServers": {
    "kenari-media": {
      "command": "npx",
      "args": ["-y", "kenari-media-mcp"],
      "env": {
        "KENARI_API_KEY": "kn-REPLACE_ME"
      }
    }
  }
}

Windows (npx is npx.cmd, which cannot be spawned directly, so clients must go through cmd):

{
  "mcpServers": {
    "kenari-media": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "kenari-media-mcp"],
      "env": {
        "KENARI_API_KEY": "kn-REPLACE_ME"
      }
    }
  }
}

Until then, use the local node + absolute-path config above.

Tools (8)

  1. list_media_models { modality?: "image"|"video" } — public catalog with per-image IDR costs. Snapshot example: 5 image models, 0 video-generation models (the video list may be [] — video tools are still implemented and pass through to the API).

  2. generate_image { model, prompt, n?, size?, background?: transparent|opaque|auto, preview?=false } — text-to-image; n capped by KENARI_MAX_IMAGE_N.

  3. edit_image { model, prompt, image_path, mask_path?, n?, size?, background?: opaque|auto } — reads local image files you pass; background: transparent is rejected by schema.

  4. create_video { model, prompt, duration?, resolution?, image_url?, end_image_url?, input_images?, video_url?, aspect_ratio? } — text/image-to-video; duration capped by KENARI_MAX_VIDEO_DURATION.

  5. extend_video { model, source, prompt?, duration? }source is a job id or an https URL; local file paths are rejected before any HTTP request.

  6. get_video_status { id } — checks a video job; auto-downloads the result when done.

  7. wait_for_video { id, timeout_ms?=1200000, download?=true } — polls every 5s with backoff capped at 15s; emits notifications/progress when the client sends a progress token. On timeout it returns still_rendering with isError: false so the agent can retry later.

  8. download_video { id } — downloads a finished video; returns a still_rendering error while rendering.

Error codes, heartbeat, timeouts

Error codes surfaced in structuredContent: unauthorized | insufficient_balance | content_policy_violation | rate_limited | invalid_model | video_failed | video_expired | still_rendering | bad_request | upstream_error.

  • 401 error bodies are plain text and are never assumed to be JSON.

  • Kenari image POSTs may stream ASCII-space "heartbeat" characters (~every 20s) before the JSON body — the server reads the full body, trims, then parses.

  • HTTP timeout: 300s for image calls. wait_for_video default budget: 20 minutes.

  • stdout carries JSON-RPC only; all logs go to stderr (console.error).

Manual live smoke test

⚠️ This spends real money. Do it once by hand, never in CI or automated tests.

  1. Build (pnpm build) and set KENARI_API_KEY.

  2. Call list_media_models → expect the image model catalog.

  3. Call generate_image with the cheapest model, n: 1 → confirm a file appears in the output dir.

  4. Call get_video_status on a bogus id → expect video_expired/bad_request, no spend.

  5. Only then try create_video if a video model exists in the catalog.

Development

pnpm test       # tsx --test tests/**/*.test.ts — mocked fetch, no live spend
pnpm typecheck  # tsc --noEmit
pnpm lint       # tsc --noEmit

Tests mock fetch entirely, so running them costs nothing and requires no API key. The model-catalog fixture lives at tests/fixtures/models.json (a copy of a real GET /v1/models snapshot).

Security notes

  • kn-* API key values are redacted in logs.

  • Never commit API keys (.env, shell history, config dumps).

  • edit_image reads local files you pass to it — only pass files you intend to upload.

  • Generation costs money on every call; beware of an agent looping on generation tools and burning IDR unattended.

License

See LICENSE.

Available Tools

8 tools
create_videoCreate VideoA

Start a Kenari video job via POST /v1/videos/generations. Returns job id; poll with get_video_status/wait_for_video. Costs money.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesKenari video-generation model id. Call list_media_models (modality='video') first for exact ids and availability.
promptYesDescribe the video to generate.
durationNoClip length in seconds. Optional; capped by KENARI_MAX_VIDEO_DURATION (default 15).
image_urlNoOptional https or data: URL of an image to use as the first/start frame.
video_urlNoOptional https URL of a source video for video-to-video transforms.
resolutionNoOutput resolution, e.g. '720p' or '1080p'. Optional and model-dependent.
aspect_ratioNoAspect ratio, e.g. '16:9' or '9:16'. Optional and model-dependent.
input_imagesNoOptional list of https or data: image URLs to condition the video on.
end_image_urlNoOptional https or data: URL of an image to use as the final frame (interpolated transition).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoKenari video job id, when relevant to the result or error.
opNoTool operation name the error occurred in.
rawNoRaw Kenari API response object.
codeNoMachine-readable code: an error code (e.g. unauthorized, bad_request, upstream_error) or a state marker (e.g. rendering, done, still_rendering).
hintNoHuman-readable remediation hint (e.g. set KENARI_API_KEY).
modelNoKenari video model id used.
statusNoHTTP status number (on API errors) or the Kenari job status string (on video status results).
disabledNoTrue when video tools are disabled via KENARI_ALLOW_VIDEO=0.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only say the tool is not read-only and not destructive, so the description carries the behavioral disclosure burden. It surfaces two non-obvious facts: the call starts an asynchronous job that only returns an id, and it costs money. Both are exactly the kind of hidden behavior an agent needs before calling a paid, async generation endpoint.

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

Conciseness5/5

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

Two dense sentences carry all the essential information: action and endpoint first, then the critical follow-up behavior and cost warning. There is no filler, repetition of the schema, or unnecessary detail.

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

Completeness5/5

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

The description is complete for a complex, paid, asynchronous tool: it identifies the job-based workflow, tells the agent how to track the result, and warns about cost. An output schema exists, so the description doesn't need to explain return values, and parameter details are already in the input schema.

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

Parameters3/5

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

Schema description coverage is 100%, with each parameter already well documented, so the baseline is 3. The tool description adds no per-parameter semantics, but it also doesn't need to repeat what the schema already provides.

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

Purpose5/5

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

The description opens with a concrete verb and resource ('Start a Kenari video job') and names the exact endpoint, which clearly identifies the tool's role. It is immediately distinguishable from read/status siblings like get_video_status and wait_for_video, and from image-focused siblings.

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

Usage Guidelines4/5

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

It gives clear context for when to call this tool: when starting a new video generation job. It also tells the agent what to do after invocation, poll via get_video_status/wait_for_video. It does not explicitly contrast with alternatives like extend_video or generate_image, but the phrase 'video job' plus the sibling names makes the intended usage unambiguous.

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

download_videoDownload VideoA

Download finished video bytes via GET /v1/videos/{id}/content to KENARI_OUTPUT_DIR. Errors with still_rendering while the job renders.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKenari video job id whose finished bytes should be downloaded.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoKenari video job id, when relevant to the result or error.
opNoTool operation name the error occurred in.
codeNoMachine-readable code: an error code (e.g. unauthorized, bad_request, upstream_error) or a state marker (e.g. rendering, done, still_rendering).
hintNoHuman-readable remediation hint (e.g. set KENARI_API_KEY).
pathsNoAbsolute local paths of downloaded video files (when done and downloaded).
statusNoHTTP status number (on API errors) or the Kenari job status string (on video status results).
disabledNoTrue when video tools are disabled via KENARI_ALLOW_VIDEO=0.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, and the description adds operational details: it writes to KENARI_OUTPUT_DIR and fails with still_rendering before rendering completes. This clarifies side effects and error behavior beyond the structured fields, without contradicting them.

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

Conciseness5/5

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

The description is two concise phrases that front-load the core action and destination, then append the error condition. Every sentence earns its place with no unnecessary prose.

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

Completeness5/5

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

With a single fully documented parameter, an output schema present, and annotations covering the safety profile, the description supplies the remaining essential operational facts: endpoint, output directory, and render-state error. Nothing needed for a correct call is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the id parameter is fully documented in the schema as 'Kenari video job id whose finished bytes should be downloaded.' The description does not add further parameter detail, so the baseline of 3 applies.

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

Purpose5/5

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

The description states a specific verb and resource: 'Download finished video bytes via GET /v1/videos/{id}/content to KENARI_OUTPUT_DIR.' This clearly distinguishes the tool from sibling creation and status tools by focusing on retrieving completed content.

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

Usage Guidelines4/5

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

The description implies when to use the tool by saying 'finished video bytes' and warns that it 'Errors with still_rendering while the job renders.' This gives clear context that the tool should be used only after rendering completes, though it does not explicitly name alternatives such as wait_for_video or get_video_status.

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

edit_imageEdit ImageA

Edit a local image via POST /v1/images/edits (multipart: image, mask?, prompt, model, n?, size?, background?). background=transparent is rejected (use generate_image instead).

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoHow many edited images to produce (integer >= 1). Defaults to 1. Capped by KENARI_MAX_IMAGE_N (default 4). Each image costs IDR.
sizeNoOutput image dimensions, e.g. '1024x1024'. Optional and model-dependent.
modelYesKenari image model id, e.g. 'gpt-image-2'. Call list_media_models first for exact ids and per-image IDR costs.
promptYesWhat to change in the image. Be specific about the edit.
mask_pathNoOptional absolute path to a mask image (multipart 'mask'). Transparent areas of the mask mark where to edit.
backgroundNoBackground handling for the edited result: 'opaque' or 'auto' only. 'transparent' is rejected here — use generate_image instead.
image_pathYesAbsolute path to the local image file to edit (uploaded as multipart 'image').

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoKenari video job id, when relevant to the result or error.
opNoTool operation name the error occurred in.
codeNoMachine-readable code: an error code (e.g. unauthorized, bad_request, upstream_error) or a state marker (e.g. rendering, done, still_rendering).
hintNoHuman-readable remediation hint (e.g. set KENARI_API_KEY).
countNoNumber of images saved.
modelNoKenari image model id used.
pathsNoAbsolute local paths of the saved image files under KENARI_OUTPUT_DIR.
statusNoHTTP status number (on API errors) or the Kenari job status string (on video status results).
disabledNoTrue when video tools are disabled via KENARI_ALLOW_VIDEO=0.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate this is not read-only and not destructive, so the description's extra context about the POST endpoint, multipart structure, and the rejected 'transparent' background adds meaningful behavioral detail. It does not contradict the annotations, and it clarifies one non-obvious failure mode.

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

Conciseness5/5

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

The description is a single focused sentence that front-loads the core action and endpoint, then packs optionality and a rejection rule into a parenthetical. There is no filler or repeated schema content.

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

Completeness4/5

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

For a tool with a fully documented input schema and an output schema, the description is largely complete: it names the endpoint, the required operation, the relevant multipart fields, and the key exception. Minor gaps such as cost or model lookup guidance are covered in the schema itself, so the description does not need to repeat them.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by compactly showing the multipart field names and optionality ('image, mask?, prompt, model, n?, size?, background?') and by explaining that 'background=transparent is rejected', which supplements the enum in the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Edit a local image via POST /v1/images/edits'. It also distinguishes itself from generate_image by explicitly noting that 'background=transparent is rejected' and directing the agent to the alternative tool.

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

Usage Guidelines4/5

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

The description clearly implies when to use this tool: when a local image needs editing. It gives an explicit when-not rule by stating that transparent backgrounds are rejected and points to generate_image as the alternative. It does not enumerate all sibling comparisons, but the primary routing guidance is present.

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

extend_videoExtend VideoA

Extend a finished video via POST /v1/videos/extensions {model, video:{url}, prompt?, duration?}. source is a job id or https URL — local paths are rejected before any HTTP call.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesKenari video-generation model id to use for the extension.
promptNoOptional continuation prompt describing how the video should continue.
sourceYesA Kenari video job id (from create_video/extend_video) or an https URL of a finished video. Local file paths are rejected before any HTTP call.
durationNoExtension length in seconds. Optional; capped by KENARI_MAX_VIDEO_DURATION (default 15).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoKenari video job id, when relevant to the result or error.
opNoTool operation name the error occurred in.
rawNoRaw Kenari API response object.
codeNoMachine-readable code: an error code (e.g. unauthorized, bad_request, upstream_error) or a state marker (e.g. rendering, done, still_rendering).
hintNoHuman-readable remediation hint (e.g. set KENARI_API_KEY).
modelNoKenari video model id used.
statusNoHTTP status number (on API errors) or the Kenari job status string (on video status results).
disabledNoTrue when video tools are disabled via KENARI_ALLOW_VIDEO=0.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark the call as non-read-only and non-destructive; the description adds that local paths are rejected before any HTTP call, which is useful fail-fast behavior. It does not discuss job asynchrony or side effects, but the annotations lower the burden and the added validation context is meaningful.

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

Conciseness5/5

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

A single dense sentence front-loads the action and then packs in the endpoint, payload shape, and the key input constraint. No filler or redundant elaboration.

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

Completeness4/5

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

With an output schema present and all parameters described in the schema, the description supplies the essential extra context: the endpoint and pre-HTTP validation behavior. A note on whether the call returns a job id asynchronously would be a nice addition, but the tool is still sufficiently complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents model, source, prompt, and duration. The description mostly restates the source semantics and gives the HTTP endpoint, adding little new parameter meaning beyond what the schema provides.

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

Purpose5/5

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

The opening phrase 'Extend a finished video' names a specific verb and resource, and the POST endpoint with payload makes the operation unambiguous. It is clearly distinguishable from sibling tools like create_video or get_video_status.

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

Usage Guidelines4/5

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

'Finished video' states the prerequisite, and the source restriction to a job id or https URL with local paths rejected tells the agent which inputs are valid. It does not explicitly name an alternative tool for non-extension generation, so it stops just short of full routing guidance.

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

generate_imageGenerate ImageA

Generate image(s) via POST /v1/images/generations. Saves PNG/JPG to KENARI_OUTPUT_DIR and returns absolute path(s). Costs IDR per image — check list_media_models first.

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoHow many images to generate (integer >= 1). Defaults to 1. Capped by KENARI_MAX_IMAGE_N (default 4). Each image costs IDR.
sizeNoImage dimensions, e.g. '1024x1024'. Optional and model-dependent.
modelYesKenari image model id, e.g. 'gpt-image-2'. Call list_media_models first for exact ids and per-image IDR costs.
promptYesWhat to generate. Be specific and descriptive for best results.
previewNoRequest lower-quality previews. Files are still saved and no base64 is returned. Does NOT reduce Kenari cost.
backgroundNoBackground handling: 'transparent', 'opaque', or 'auto'. Optional; not all models support transparency.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoKenari video job id, when relevant to the result or error.
opNoTool operation name the error occurred in.
codeNoMachine-readable code: an error code (e.g. unauthorized, bad_request, upstream_error) or a state marker (e.g. rendering, done, still_rendering).
hintNoHuman-readable remediation hint (e.g. set KENARI_API_KEY).
countNoNumber of images saved.
modelNoKenari image model id used.
pathsNoAbsolute local paths of the saved image files under KENARI_OUTPUT_DIR.
statusNoHTTP status number (on API errors) or the Kenari job status string (on video status results).
disabledNoTrue when video tools are disabled via KENARI_ALLOW_VIDEO=0.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations establish that this is a write operation but non-destructive. The description adds valuable behavioral detail beyond the annotations: it saves PNG/JPG files to KENARI_OUTPUT_DIR, returns absolute paths, and incurs monetary cost. This gives the agent practical expectations about side effects.

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

Conciseness5/5

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

The description is compact and front-loaded, covering purpose, mechanism, output location, return value, and cost guidance in two sentences. Every clause contributes useful information without repetition or filler.

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

Completeness5/5

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

Given the fully described schema, existing output schema, and annotations, the description supplies the missing operational context: where files go, what is returned, and a prerequisite to check list_media_models. An agent has enough to call this tool correctly without ambiguity.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds no parameter-specific meaning beyond what the schema already provides; the cost and model-id guidance mirrors the model parameter description. It does not harm or clarify individual params further.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Generate image(s)' and gives the exact API endpoint, POST /v1/images/generations. It clearly distinguishes this from sibling tools like edit_image and create_video by stating it creates images and saves them to disk.

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

Usage Guidelines4/5

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

The description gives clear context: use this to generate images, expect per-image IDR costs, and check list_media_models first for model IDs and pricing. It does not explicitly contrast with edit_image or state when to avoid this tool, but the context is strong enough for an agent to select it appropriately.

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

get_video_statusGet Video StatusA
Idempotent

GET /v1/videos/{id}. Reports queued/rendering/done/failed/expired. Auto-downloads to KENARI_OUTPUT_DIR when done.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKenari video job id returned by create_video or extend_video.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoKenari video job id, when relevant to the result or error.
opNoTool operation name the error occurred in.
codeNoMachine-readable code: an error code (e.g. unauthorized, bad_request, upstream_error) or a state marker (e.g. rendering, done, still_rendering).
hintNoHuman-readable remediation hint (e.g. set KENARI_API_KEY).
pathsNoAbsolute local paths of downloaded video files (when done and downloaded).
statusNoHTTP status number (on API errors) or the Kenari job status string (on video status results).
disabledNoTrue when video tools are disabled via KENARI_ALLOW_VIDEO=0.

TDQS

A3.8/5.0
Behavior4/5

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

The description adds important behavioral context beyond the annotations: although this is a GET endpoint, it auto-downloads to KENARI_OUTPUT_DIR when done, which explains the readOnlyHint=false annotation. This side effect is critical for an agent to invoke the tool safely. It does not detail auth or error handling, but the response semantics are largely covered by the output schema.

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

Conciseness5/5

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

The description is only two sentences and front-loads the endpoint, then packs statuses and the side effect into compact, useful phrasing. Every clause earns its place with no unnecessary filler.

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

Completeness4/5

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

For a single-parameter status tool with an output schema and annotations, the description covers the core purpose, the possible states, and a meaningful side effect. The main gap is the lack of explicit routing guidance among the closely related sibling tools, but this is a minor omission given the simple interface.

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

Parameters3/5

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

The schema already fully describes the id parameter as the Kenari video job id returned by create_video or extend_video, with 100% coverage. The description only echoes {id} in the endpoint, adding no new parameter-level meaning beyond the schema.

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

Purpose4/5

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

The description names a specific resource and action: 'GET /v1/videos/{id}' and 'Reports queued/rendering/done/failed/expired.' This clearly conveys what the tool does, but it does not explicitly contrast it with sibling tools like wait_for_video or download_video, so it stops short of full differentiation.

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

Usage Guidelines3/5

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

Usage context is implied rather than explicit. The auto-download note suggests callers may not need a separate download step when the status is done, but the description never tells the agent when to prefer this tool over wait_for_video or download_video, and no exclusions are stated.

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

list_media_modelsList Kenari Media ModelsA
Read-only

List Kenari media-capable models (image/video). Public, no key needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
modalityNoFilter by media modality: 'image' returns image generation/edit models, 'video' returns video-generation models (the video list may be empty). Omit to list all media-capable models.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoKenari video job id, when relevant to the result or error.
opNoTool operation name the error occurred in.
codeNoMachine-readable code: an error code (e.g. unauthorized, bad_request, upstream_error) or a state marker (e.g. rendering, done, still_rendering).
hintNoHuman-readable remediation hint (e.g. set KENARI_API_KEY).
modelsNoKenari media-capable models matching the modality filter.
statusNoHTTP status number (on API errors) or the Kenari job status string (on video status results).
disabledNoTrue when video tools are disabled via KENARI_ALLOW_VIDEO=0.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate a safe read-only operation, and the description adds useful auth context by stating that the call is public and requires no key. It does not discuss pagination or empty-result behavior beyond the schema-level note about video, but with readOnlyHint=true and an output schema present, the behavioral disclosure is adequate.

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

Conciseness4/5

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

The description is short, front-loaded, and contains no filler. The second sentence earns its place by adding the auth requirement. It loses a point only because the first sentence largely restates the tool title rather than adding substantially new information.

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

Completeness5/5

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

For a simple read-only listing tool with one optional parameter and an output schema, the description is complete enough. An agent knows what the tool does, that no auth is needed, and that modality filtering is available, while the schema and annotations cover the remaining details.

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

Parameters3/5

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

The input schema fully documents the single optional parameter, including its enum values, filtering semantics, and the caveat that the video list may be empty. The tool description itself adds no parameter-level meaning, so the baseline score of 3 applies.

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

Purpose5/5

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

The description states a specific verb (List), a concrete resource (Kenari media-capable models), and narrows the scope to image/video. This clearly differentiates it from the sibling generation and editing tools, which perform actions rather than list catalog data.

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

Usage Guidelines4/5

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

The description gives clear context: this is a discovery/catalog tool for available media models, and the 'Public, no key needed' note signals that it can be called without setup. It does not explicitly state when-not-to-use it or name alternatives, but no sibling tool performs the same listing function, so the usage context is reasonably clear.

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

wait_for_videoWait For VideoA

Poll GET /v1/videos/{id} every 5s (backoff cap 15s) until done/failed/expired or timeout (default 20 min). Auto-downloads when done. Timeout returns still_rendering with isError=false.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKenari video job id returned by create_video or extend_video.
downloadNoWhen true (default), auto-download the finished video to KENARI_OUTPUT_DIR and return its absolute path.
timeout_msNoMaximum time to keep polling in milliseconds (>= 1000). Defaults to 1200000 (20 min). On timeout returns still_rendering (not an error) — call again.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoKenari video job id, when relevant to the result or error.
opNoTool operation name the error occurred in.
codeNoMachine-readable code: an error code (e.g. unauthorized, bad_request, upstream_error) or a state marker (e.g. rendering, done, still_rendering).
hintNoHuman-readable remediation hint (e.g. set KENARI_API_KEY).
pathsNoAbsolute local paths of downloaded video files (when done and downloaded).
statusNoHTTP status number (on API errors) or the Kenari job status string (on video status results).
disabledNoTrue when video tools are disabled via KENARI_ALLOW_VIDEO=0.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond annotations, the description discloses the polling interval (5s), backoff cap (15s), terminal states (done/failed/expired), timeout default (20 min), auto-download side effect, and the important non-error timeout result (still_rendering with isError=false). This is rich behavioral context that annotations alone do not provide.

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

Conciseness5/5

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

Two sentences with no filler: the endpoint, polling policy, termination conditions, timeout semantics, and auto-download behavior are packed into a compact, front-loaded description. Every clause adds value.

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

Completeness5/5

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

For a 3-parameter tool with a full input schema, an output schema, and annotations, the description covers the essential operational details: what is polled, how often, when it stops, what happens on timeout, and the auto-download side effect. Nothing critical for selecting or invoking the tool is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents id, download, and timeout_ms with clear meanings. The description restates the timeout default and poll behavior but does not add significant parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description names a specific action (poll GET /v1/videos/{id}) with a clear resource and termination condition, and distinguishes this tool from get_video_status (single status check) and download_video (explicit download) by stating it polls until done and auto-downloads. The endpoint and behavior make the tool's role unmistakable.

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

Usage Guidelines4/5

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

The description gives clear context: this is a blocking poll-and-wait tool that auto-downloads when finished, and timeout is a non-error retry signal. It does not explicitly name sibling alternatives or state when not to use it, but the polling and auto-download behavior strongly imply the intended use case.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 8 tool updatesv0.1.0
    • First observedcreate_video
    • First observeddownload_video
    • First observededit_image
    • First observedextend_video
    • First observedgenerate_image
    • First observedget_video_status
    • First observedlist_media_models
    • First observedwait_for_video

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation4/5

Most tools map cleanly to distinct actions: listing models, generating/editing images, creating/extending video, and checking/downloading video. The only real ambiguity is among get_video_status, wait_for_video, and download_video, since both status tools auto-download and the download tool has overlapping output behavior.

Naming Consistency4/5

Tool names mostly follow a clear verb_noun snake_case pattern, such as list_media_models, generate_image, edit_image, create_video, and download_video. Minor inconsistency exists between generate_image and create_video, and wait_for_video breaks the strict verb_noun shape, but the pattern remains predictable.

Tool Count5/5

Eight tools is well-scoped for a media-generation server covering both image and video workflows. Each tool addresses a meaningful step in the generation lifecycle without excessive redundancy.

Completeness4/5

The image and video generation flows are well covered: list models, generate/edit images, create/extend videos, poll status, and download results. Minor gaps include no cancellation or deletion of video jobs and no listing of historical jobs, but agents can complete core tasks without dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dnshtm9/kenari-media-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server