Skip to main content
Glama

banana-image-mcp

npm version npm downloads License: MIT Node.js Version MCP

中文文档

An MCP (Model Context Protocol) server for image generation, processing, and CDN upload. Powered by Google Gemini AI, Sharp, with Qiniu Cloud and Aliyun OSS support.

Features

  • Generate images from text prompts using Google Gemini AI

  • Proxy & gateway support — reach Google Gemini from restricted networks (e.g. mainland China) via a forward proxy (PROXY_URL) or a self-hosted reverse-proxy gateway (GEMINI_BASE_URL)

  • Configurable model — default gemini-3.1-flash-image-preview, or switch to gemini-3.1-flash-lite-image

  • Configurable aspect ratio & resolution — e.g. 16:9 / 1:1 / 9:16 and 1K / 2K / 4K

  • Interactive setup wizard — run banana-image-mcp setup to write your config automatically, no hand-editing JSON

  • Upload local or remote images to CDN (Qiniu Cloud or Aliyun OSS)

  • Automatic conversion to WebP format with compression

  • Date-prefixed filenames with customizable upload paths

  • Temporary files are cleaned up automatically

  • Switch upload provider via environment variable

Related MCP server: Gemini Image MCP

Quick Start

Interactive setup (setup) — recommended

After installing (or on first use), run the setup wizard to configure everything — no hand-editing JSON:

npx -y banana-image-mcp setup
# or, if installed globally:
banana-image-mcp setup

It first asks your preferred language (中文 / English), then walks you through:

  1. Which client(s) to write to (multi-select): Claude Code, Claude Desktop, Cursor, Codex, or a custom JSON path;

  2. Run command: npx (recommended) or the global banana-image-mcp;

  3. GEMINI_API_KEY and proxy / gateway (PROXY_URL or GEMINI_BASE_URL, see Network);

  4. Image model, aspect ratio, resolution;

  5. Upload provider (Qiniu / Aliyun OSS) and its keys.

Made a typo? Type b (or back) at any prompt to go back to the previous step. A review screen at the end lets you check everything (secrets masked) before writing.

It then merges the banana-image entry into each selected config file (backing up the original first), without touching your other MCP servers (Codex's config.toml is edited in place, preserving its other sections and comments). Restart the client(s) afterwards to apply.

Manual configuration

Prefer editing config yourself? Add the banana-image server to your MCP client's config file.

No installation needed — configure directly in your MCP client:

Qiniu Cloud (default):

{
  "mcpServers": {
    "banana-image": {
      "command": "npx",
      "args": ["-y", "banana-image-mcp"],
      "env": {
        "GEMINI_API_KEY": "your-gemini-api-key",
        "QINIU_ACCESS_KEY": "your-qiniu-access-key",
        "QINIU_SECRET_KEY": "your-qiniu-secret-key",
        "QINIU_BUCKET": "your-bucket-name",
        "QINIU_CDN_DOMAIN": "https://your-cdn-domain.com"
      }
    }
  }
}

Aliyun OSS:

{
  "mcpServers": {
    "banana-image": {
      "command": "npx",
      "args": ["-y", "banana-image-mcp"],
      "env": {
        "GEMINI_API_KEY": "your-gemini-api-key",
        "UPLOAD_PROVIDER": "aliyun",
        "ALIYUN_OSS_ACCESS_KEY_ID": "your-access-key-id",
        "ALIYUN_OSS_ACCESS_KEY_SECRET": "your-access-key-secret",
        "ALIYUN_OSS_BUCKET": "your-bucket-name",
        "ALIYUN_OSS_REGION": "oss-cn-hangzhou",
        "ALIYUN_OSS_CDN_DOMAIN": "https://your-cdn-domain.com"
      }
    }
  }
}

Global installation

npm install -g banana-image-mcp

Then configure in your MCP client:

Qiniu Cloud (default):

{
  "mcpServers": {
    "banana-image": {
      "command": "banana-image-mcp",
      "env": {
        "GEMINI_API_KEY": "your-gemini-api-key",
        "QINIU_ACCESS_KEY": "your-qiniu-access-key",
        "QINIU_SECRET_KEY": "your-qiniu-secret-key",
        "QINIU_BUCKET": "your-bucket-name",
        "QINIU_CDN_DOMAIN": "https://your-cdn-domain.com"
      }
    }
  }
}

Aliyun OSS:

{
  "mcpServers": {
    "banana-image": {
      "command": "banana-image-mcp",
      "env": {
        "GEMINI_API_KEY": "your-gemini-api-key",
        "UPLOAD_PROVIDER": "aliyun",
        "ALIYUN_OSS_ACCESS_KEY_ID": "your-access-key-id",
        "ALIYUN_OSS_ACCESS_KEY_SECRET": "your-access-key-secret",
        "ALIYUN_OSS_BUCKET": "your-bucket-name",
        "ALIYUN_OSS_REGION": "oss-cn-hangzhou",
        "ALIYUN_OSS_CDN_DOMAIN": "https://your-cdn-domain.com"
      }
    }
  }
}

With a proxy (e.g. mainland China)

Google Gemini is often not directly reachable from mainland China. Pick one of the two approaches and add its variables to the env block. See Network — two ways to reach Gemini for the full explanation.

A. Forward proxy — a local client (Clash / V2Ray / Shadowsocks) or a paid HTTP proxy. Add PROXY_URL:

{
  "mcpServers": {
    "banana-image": {
      "command": "npx",
      "args": ["-y", "banana-image-mcp"],
      "env": {
        "GEMINI_API_KEY": "your-gemini-api-key",
        "PROXY_URL": "http://127.0.0.1:7890",
        "QINIU_ACCESS_KEY": "your-qiniu-access-key",
        "QINIU_SECRET_KEY": "your-qiniu-secret-key",
        "QINIU_BUCKET": "your-bucket-name",
        "QINIU_CDN_DOMAIN": "https://your-cdn-domain.com"
      }
    }
  }
}
  • Clash / Clash Verge / ClashX: use the mixed/HTTP port shown under Settings → Port (default 7890) → http://127.0.0.1:7890. Alternatively, enable TUN mode to route all traffic transparently — then you don't need PROXY_URL at all.

  • Proxy that needs a login: http://username:password@host:port (URL-encode special characters in the password, e.g. +%2B).

  • ⚠️ Just toggling your client's system proxy (even in "Global"/rule mode) is not enough — Node's fetch ignores OS proxy settings. Use PROXY_URL, or a transparent TUN mode.

B. Reverse-proxy gateway — a self-hosted endpoint (e.g. a Cloudflare Worker) that forwards to the Gemini API. Set GEMINI_BASE_URL (and any header it requires) instead of PROXY_URL. Because GEMINI_EXTRA_HEADERS is a JSON string inside JSON, the inner quotes are escaped with \":

{
  "mcpServers": {
    "banana-image": {
      "command": "npx",
      "args": ["-y", "banana-image-mcp"],
      "env": {
        "GEMINI_API_KEY": "your-gemini-api-key",
        "GEMINI_BASE_URL": "https://gemini.example.com",
        "GEMINI_EXTRA_HEADERS": "{\"x-cf-proxy-key\":\"your-gateway-key\"}",
        "QINIU_ACCESS_KEY": "your-qiniu-access-key",
        "QINIU_SECRET_KEY": "your-qiniu-secret-key",
        "QINIU_BUCKET": "your-bucket-name",
        "QINIU_CDN_DOMAIN": "https://your-cdn-domain.com"
      }
    }
  }
}

Codex (CLI & Desktop)

Codex CLI and the Codex desktop app (Codex.app) share the same config file — ~/.codex/config.toml (TOML, not JSON) — so configuring it once covers both. The easiest way is the wizard (banana-image-mcp setup → select Codex), which merges the entry and backs up the file. To do it by hand, add:

[mcp_servers.banana-image]
command = "/absolute/path/to/npx"
args = ["-y", "banana-image-mcp"]

[mcp_servers.banana-image.env]
GEMINI_API_KEY = "your-gemini-api-key"
# add PROXY_URL or GEMINI_BASE_URL here if you need a proxy/gateway (see Network below)
UPLOAD_PROVIDER = "qiniu"
QINIU_ACCESS_KEY = "your-qiniu-access-key"
QINIU_SECRET_KEY = "your-qiniu-secret-key"
QINIU_BUCKET = "your-bucket-name"
QINIU_CDN_DOMAIN = "https://your-cdn-domain.com"

⚠️ Use an absolute path for command (the output of which npx), not bare npx. The Codex desktop app does not inherit your shell PATH, so "npx" alone usually fails to launch there. Also point it at a node/npx version sharp supports (Node 18 / 20 / 22 — avoid brand-new majors like 26 that have no prebuilt binaries yet). For example, an nvm path looks like ~/.nvm/versions/node/v22.16.0/bin/npx.

Restart Codex (start a new CLI session, or quit & reopen the desktop app) to load the server.

Upgrade

# npx users: just clear the cache to get the latest version
npx clear-npx-cache && npx -y banana-image-mcp

# Global installation users
npm update -g banana-image-mcp

Configuration file location

The banana-image entry lives under the mcpServers object of your client's config file:

Client

OS

Path

Claude Code

macOS

~/.claude.json

Claude Code

Windows

%USERPROFILE%\.claude.json

Claude Desktop

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Claude Desktop

Windows

%APPDATA%\Claude\claude_desktop_config.json

Cursor

macOS / Windows

~/.cursor/mcp.json

Codex

macOS / Windows

~/.codex/config.toml (TOML: [mcp_servers.banana-image])

Tip: run banana-image-mcp setup to have the file(s) created/updated for you — it targets any of the clients above (or a custom path) and backs up the existing file first.

For Claude Code you can also add the server from the CLI:

claude mcp add banana-image -- npx -y banana-image-mcp

CLI Commands

Command

Description

banana-image-mcp setup

Interactive config wizard

banana-image-mcp history

View generation history / log

banana-image-mcp --version

Print the version

banana-image-mcp

Run the MCP server over stdio (used by MCP clients)

history — generation log

Every generate_image / generate_blog_cover / upload_image call is logged to ~/.banana-image-mcp/history.jsonl. View it as a table (latest first):

npx -y banana-image-mcp history

It shows date/time, result (success/failure), tool type, model, image size, generation time, and the image URL (or failure reason). The latest 10 entries are shown; in an interactive terminal use ↑/↓ (or j/k) to page through older entries and q to quit.

   #  时间                 结果    类型  模型                     大小       耗时     链接 / 失败原因
 ───────────────────────────────────────────────────────────────────────────────────────────────────
   1  2026-07-09 22:15:03  ✓ 成功  封面  3.1-flash-image-preview  186.4 KB   3.4s     https://cdn.example.com/…
   2  2026-07-09 21:58:11  ✗ 失败  生图  3.1-flash-lite-image     —          0.9s     fetch failed (proxy?)

Environment Variables

Upload Provider

Variable

Description

UPLOAD_PROVIDER

Upload provider: qiniu (default) or aliyun

Image Generation

Variable

Default

Description

GEMINI_API_KEY

Google Gemini API key for image generation (required)

GEMINI_IMAGE_MODEL

gemini-3.1-flash-image-preview

Image model. Also supports gemini-3.1-flash-lite-image

GEMINI_ASPECT_RATIO

16:9

Aspect ratio, e.g. 16:9, 1:1, 9:16, 4:3, 3:2, 21:9

GEMINI_IMAGE_SIZE

1K

Resolution: 1K, 2K or 4K

WEBP_QUALITY

80

WebP compression quality (1–100)

These are defaults; generate_blog_cover and generate_image also accept per-call model / aspectRatio / imageSize parameters that override the environment values.

Network — two ways to reach Gemini

Useful when Google Gemini is not directly reachable (e.g. mainland China). There are two independent mechanisms — pick whichever matches your proxy.

1. Forward proxy (PROXY_URL) — tunnels raw traffic to Google. Use this for a local client like Clash / V2Ray / Shadowsocks, or a paid HTTP proxy service.

Variable

Description

PROXY_URL

HTTP/HTTPS forward proxy, e.g. http://127.0.0.1:7890 or http://user:pass@host:port

  • Usually the local proxy port of your client (Clash's default mixed port is 7890http://127.0.0.1:7890).

  • Basic-auth proxies are supported via http://user:pass@host:port (URL-encode special characters in the password, e.g. +%2B).

  • Only HTTP/HTTPS proxies are supported (not SOCKS5).

  • If PROXY_URL is unset, the standard HTTPS_PROXY / HTTP_PROXY / ALL_PROXY env vars are honored too.

  • Applied to both Gemini API calls and remote image downloads.

⚠️ Node's built-in fetch does not honor your OS "system proxy" setting. Enabling your client's system-proxy toggle alone (even in "global"/rule mode) won't route this server. Either set PROXY_URL, or use a transparent TUN / virtual-NIC mode — that captures all traffic at the network layer, so no PROXY_URL is needed.

2. Reverse-proxy gateway (GEMINI_BASE_URL [+ GEMINI_EXTRA_HEADERS]) — point the SDK at a self-hosted endpoint that forwards to the Gemini API (e.g. a Cloudflare Worker). In this case do not set PROXY_URL.

Variable

Description

GEMINI_BASE_URL

Base URL of your gateway, e.g. https://gemini.example.com

GEMINI_EXTRA_HEADERS

Optional custom headers the gateway requires. JSON, e.g. {"x-cf-proxy-key":"..."} — a Name: value; Name2: value2 string also works

Qiniu Cloud (when UPLOAD_PROVIDER=qiniu or not set)

Variable

Description

QINIU_ACCESS_KEY

Qiniu cloud access key

QINIU_SECRET_KEY

Qiniu cloud secret key

QINIU_BUCKET

Qiniu storage bucket name

QINIU_CDN_DOMAIN

CDN domain for generated image URLs

Aliyun OSS (when UPLOAD_PROVIDER=aliyun)

Variable

Required

Description

ALIYUN_OSS_ACCESS_KEY_ID

Yes

Aliyun AccessKey ID

ALIYUN_OSS_ACCESS_KEY_SECRET

Yes

Aliyun AccessKey Secret

ALIYUN_OSS_BUCKET

Yes

OSS bucket name

ALIYUN_OSS_REGION

Yes

OSS region, e.g. oss-cn-hangzhou

ALIYUN_OSS_CDN_DOMAIN

No

Custom CDN domain (falls back to default OSS URL if not set)

Getting API Keys

Google Gemini API Key:

  1. Visit Google AI Studio

  2. Create or get an API key

Qiniu Cloud:

  1. Register at Qiniu Cloud

  2. Create a storage bucket

  3. Get AccessKey and SecretKey from your account settings

  4. Configure a CDN domain

Aliyun OSS:

  1. Register at Aliyun

  2. Create an OSS bucket

  3. Get AccessKey ID and AccessKey Secret from your account settings

  4. Note your bucket's region (e.g. oss-cn-hangzhou)

Tools

generate_blog_cover

Generate a blog cover image, convert to WebP, and upload to CDN. The image dimensions follow the configured aspect ratio / resolution (default 16:9 at 1K).

Parameter

Type

Required

Description

prompt

string

Yes

Text prompt describing the image to generate

slug

string

Yes

Slug identifier for the filename (prefixed with date)

path

string

No

Upload directory path (default: blog-cover)

model

string

No

Model override (default: GEMINI_IMAGE_MODEL or gemini-3.1-flash-image-preview)

aspectRatio

string

No

Aspect ratio override (default: GEMINI_ASPECT_RATIO or 16:9)

imageSize

string

No

Resolution override 1K/2K/4K (default: GEMINI_IMAGE_SIZE or 1K)

Returns:

{
  "url": "https://your-cdn-domain.com/blog-cover/20260321-my-post.webp"
}

generate_image

Generate an image using Gemini AI, convert to WebP, and upload to CDN.

Parameter

Type

Required

Description

prompt

string

Yes

Text prompt describing the image to generate

slug

string

Yes

Slug identifier for the filename (prefixed with date)

path

string

No

Upload directory path (default: aigc/image)

model

string

No

Model override (default: GEMINI_IMAGE_MODEL or gemini-3.1-flash-image-preview)

aspectRatio

string

No

Aspect ratio override (default: GEMINI_ASPECT_RATIO or 16:9)

imageSize

string

No

Resolution override 1K/2K/4K (default: GEMINI_IMAGE_SIZE or 1K)

Returns:

{
  "url": "https://your-cdn-domain.com/aigc/image/20260321-my-image.webp"
}

upload_image

Upload a local file or remote URL image to CDN, with automatic WebP conversion.

Parameter

Type

Required

Description

source

string

Yes

Local file path or HTTP/HTTPS URL of the image

slug

string

Yes

Slug identifier for the filename (prefixed with date)

path

string

No

Upload directory path (default: images)

Returns:

{
  "url": "https://your-cdn-domain.com/images/20260321-my-photo.webp"
}

Architecture

prompt → Google Gemini API (PNG) → Sharp (WebP) → CDN (Qiniu / Aliyun OSS) → URL
source (local/remote) ─────────→ Sharp (WebP) → CDN (Qiniu / Aliyun OSS) → URL
  • Image generation: Google Gemini (gemini-3.1-flash-image-preview by default, configurable), reachable via optional forward proxy or reverse-proxy gateway

  • Image processing: Sharp (WebP conversion; generated aspect ratio / resolution are preserved)

  • Cloud storage: Qiniu Cloud or Aliyun OSS (configurable via UPLOAD_PROVIDER)

License

MIT

Available Tools

3 tools
generate_blog_coverA

Generate a blog cover image using Google Gemini AI, convert to WebP format, and upload to Qiniu CDN

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYesThe text prompt describing the image to generate
slugYesThe slug identifier for the filename (will be prefixed with date)
pathNoUpload directory path (default: 'blog-cover')blog-cover

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full disclosure burden. It successfully documents the multi-step pipeline (generation, conversion, upload) and external dependencies, but fails to disclose critical behavioral traits like whether the CDN upload is idempotent, what happens on naming collisions, or what the tool returns (URL, path, or binary).

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, efficiently structured sentence that front-loads the action and logically flows through the processing pipeline (generate → convert → upload). Every word serves a purpose with no redundancy.

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

Completeness3/5

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

Given the absence of both annotations and output schema, the description should explain return values and side effects (e.g., 'returns public CDN URL'). It adequately covers the input workflow but leaves critical gaps regarding the operation's output and mutation characteristics.

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 has 100% description coverage, establishing a baseline of 3. The description adds minimal semantic value beyond the schema, though it implicitly reinforces that 'slug' relates to blog posts through the workflow context. No additional parameter constraints or format details are provided.

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

Purpose5/5

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

The description explicitly states the specific verb (Generate), resource (blog cover image), AI technology (Google Gemini), format conversion (WebP), and destination (Qiniu CDN). This specificity effectively distinguishes it from the generic 'generate_image' and single-purpose 'upload_image' siblings.

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?

While the specificity of 'blog cover' implies the intended use case, the description does not explicitly state when to choose this tool over 'generate_image' or 'upload_image', nor does it mention prerequisites like requiring valid CDN credentials or prompt engineering best practices.

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

generate_imageA

Generate an image using Google Gemini AI, convert to WebP format, upload to Qiniu CDN, and return the CDN URL

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYesThe text prompt describing the image to generate
slugYesThe slug identifier for the filename (will be prefixed with date)
pathNoUpload directory path on CDN (default: 'aigc/image')aigc/image

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full disclosure burden and succeeds in revealing the AI provider (Google Gemini), format conversion (WebP), storage destination (Qiniu CDN), and return value type (CDN URL). It lacks rate limits, authentication requirements, or error handling details, but covers the essential behavioral chain adequately.

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, efficiently structured sentence that front-loads the action sequence. Every clause provides distinct value: AI provider identification, format specification, storage destination, and return type. Zero redundancy or filler 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 3-parameter tool with no output schema, the description adequately covers the full operation lifecycle from generation through delivery. It mentions the return value (CDN URL) despite lacking a formal output schema. Minor gap: no mention of error conditions, latency expectations, or image dimension constraints.

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?

Input schema has 100% description coverage, establishing a baseline of 3. The description focuses on the operational workflow rather than adding parameter-specific semantics (e.g., prompt length constraints, slug format rules, valid path values). No additional parameter context is provided beyond the schema definitions.

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 uses specific verbs (generate, convert, upload, return) and clearly identifies the resource (image), AI provider (Google Gemini), format (WebP), and destination (Qiniu CDN). It distinguishes from sibling 'upload_image' by including generation capability and from 'generate_blog_cover' by implying general-purpose use through the absence of blog-specific constraints.

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?

While the description implies usage through its specific workflow (generation + conversion + upload), it lacks explicit guidance on when to choose this over 'upload_image' (for existing files) or 'generate_blog_cover' (for specific blog formatting). The agent must infer the appropriate use case from the described behavior chain.

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

upload_imageA

Upload a local or remote image to Qiniu CDN, convert to WebP format, and return the CDN URL

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesLocal file path or HTTP/HTTPS URL of the image to upload
slugYesThe slug identifier for the filename (will be prefixed with date)
pathNoUpload directory path on CDN (default: 'images')images

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses the WebP conversion side effect and CDN URL return, but omits mutation safety details (overwrite behavior, idempotency, whether local files are deleted), authentication requirements, or error conditions.

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?

Single sentence of 15 words with zero waste. Front-loaded with the core action, includes all key elements (source types, destination, transformation, output), and avoids filler words or redundant phrases.

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 3-parameter upload tool with no output schema, the description adequately covers the essential contract: input handling, processing side effects, and return value. Minor gaps remain regarding error handling, overwrite semantics, and authentication, but the core functionality is well-documented.

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%, establishing a baseline of 3. The description adds minimal parameter-specific context beyond the schema, though 'local or remote' reinforces the source parameter's dual-purpose nature. No additional syntax guidance or format examples are provided.

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

Purpose5/5

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

The description clearly states the specific action (upload), resource type (image), destination (Qiniu CDN), transformation (convert to WebP), and return value (CDN URL). It effectively distinguishes from siblings generate_image and generate_blog_cover by emphasizing 'upload' versus generation.

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?

While the verb 'upload' implies usage for existing images versus generating new ones, the description lacks explicit when-to-use guidance or named alternatives. It does not clarify whether to use this versus the generate_* siblings when both might apply.

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. 3 tool updatesv1.1.0
    • First observedgenerate_blog_cover
    • First observedgenerate_image
    • First observedupload_image

TDQS

A3.7/5.0
Disambiguation2/5

generate_blog_cover and generate_image have nearly identical descriptions and purposes—both use Gemini AI, convert to WebP, and upload to Qiniu. An agent cannot determine which to use for creating blog covers versus general images based on the descriptions provided.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern (generate_blog_cover, generate_image, upload_image) with clear action-oriented verbs.

Tool Count4/5

Three tools is reasonable for an image generation and CDN upload service, though the functional redundancy between the two generation tools effectively reduces the distinct capability count to two.

Completeness3/5

The set covers basic generation and upload workflows but lacks lifecycle management operations (delete, list, retrieve metadata). The redundant generation tools suggest an incomplete design rather than comprehensive coverage.

Maintenance

ActivityStale
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/xinpengfei520/banana-image-mcp'

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