Skip to main content
Glama

MCP OpenAI Images

A local MCP server (stdio) that lets Claude (or any MCP client) generate and edit images with the OpenAI Images API (GPT Image models) — from scratch, from up to 16 reference images, or with inpainting masks — and then crop them to exact sizes and overlay text using your real brand fonts.

Built for marketing pipelines: generate a master image for a topic, then derive per-channel pieces (blog, LinkedIn, Instagram, YouTube thumbnail, newsletter) from it so they stay visually consistent.

It runs locally on your Mac on purpose: cloud sandboxes (such as Cowork's) block egress to api.openai.com, while a local MCP server is reachable from Claude Code, Claude Desktop, and Cowork sessions through the remote-devices bridge.

Tools

Tool

What it does

Cost

generar_imagen

Generates an image from a text prompt

OpenAI

generar_variacion

Generates a new image from 1–16 reference images (URL — including signed URLs —, local path, data URL, or base64), with an optional mask for inpainting

OpenAI

componer_imagen

Applies crop_to / overlay_text to an existing image without regenerating it

Free

instalar_fuente_google

Downloads a font family from the official Google Fonts repository into fonts/ — only when the user explicitly asks for a font

Free

listar_modelos_imagen

Lists the image models your API key can use (also a connection test)

Free

resumen_gasto

Summarizes estimated spend per model from the local log

Free

Tool names and responses are in Spanish, since the server is used by Spanish-speaking agents.

Common parameters

Parameter

Description

prompt

Prompt sent verbatim to OpenAI (English recommended)

size

cuadrada (1024x1024, default) · apaisada (1536x1024, 3:2) · vertical (1024x1536, 2:3) · auto · or any WIDTHxHEIGHT on gpt-image-2+ (multiples of 16, aspect ratio 1:3–3:1)

quality

low · medium (default) · high (xhigh / max on gpt-image-2.5-*)

background

opaque · transparent · auto

n

Number of variants (1–10)

model

Overrides the default model for this call

output_format / output_compression

png (default) · jpeg · webp, and quality 0–100

crop_to

{ width, height, position? } — resize/crop the result to exact pixels (e.g. 1280x720 for YouTube)

overlay_text

Array of { text, x, y, fontSize, fontFamily, color, fontWeight?, maxWidth?, align? } rendered with real font files instead of AI-generated lettering

nombre_archivo

Filename prefix

incluir_base64

Also return file_name + file_base64 (default false, see below)

incluir_preview

Return a 512px thumbnail so the agent can review the result (default true)

Post-processing order: OpenAI image → crop_tooverlay_text (coordinates refer to the final image).

Related MCP server: image-studio-mcp

Requirements

  • macOS (other platforms should work, but font lookup is tuned for macOS)

  • Node.js 20 or later

  • An OpenAI API key with access to GPT Image models

Installation

git clone https://github.com/Go-Business-Inc/MCP-OpenIA.git
cd MCP-OpenIA
npm install
npm run build
cp .env.example .env
chmod 600 .env

Put your key in .env as OPENAI_API_KEY=.... Never hardcode it, paste it into a chat, or store it in shared documents.

Brand fonts

overlay_text looks for font files in fonts/, ~/Library/Fonts, and /Library/Fonts. Drop the .ttf files of your brand typefaces into fonts/ (see fonts/README.md). If a font can't be found — or lacks a character in your text — the tool returns an error instead of silently substituting another typeface, and it checks the font before calling OpenAI, so no money is spent.

To add a font later, drop its files into fonts/ (or install it on the Mac) — no restart needed. For Google Fonts families, the agent can also call instalar_fuente_google with the family name (e.g. "Playfair Display"): it downloads the variable (or non-italic static) .ttf files and the license only from the official google/fonts repository, validates them, and makes them available immediately. The tool is described to the agent as usable only when the user explicitly requests a font, so it won't swap your brand typography on its own. Commercial fonts must be installed manually.

Text is drawn from the font file's glyph outlines (via fontkit), not through the system text renderer, so the result doesn't depend on which fonts are installed. Variable fonts are supported: fontWeight sets the wght axis and fontSize the opsz axis when present.

Registering the server

The server has to be registered in each Claude app that should use it. Claude Code and Claude Desktop keep separate configurations, so registering it in one doesn't make it available in the other.

Claude Code

claude mcp add --scope user openai-images -- node /absolute/path/to/MCP-OpenIA/dist/index.js

Then restart your Claude Code session and check that the tools are listed with /mcp.

Claude Desktop (and Cowork)

Claude Desktop reads its MCP servers from ~/Library/Application Support/Claude/claude_desktop_config.json. Cowork sessions reach local servers through Claude Desktop's remote-devices bridge, so registering the server here is what makes it available in Cowork too.

IMPORTANT

Don't edit claude_desktop_config.json while Claude Desktop is running. The app keeps that file in memory and rewrites it on its own while it runs (for example, when a Cowork session connects), so an entry added with the app open is silently removed minutes later — often before you restart. The app doesn't write the file when it quits, so edits made while it's closed are safe.

  1. Open Terminal.app (or iTerm). Don't use Claude Desktop's built-in terminal or ask Claude inside the app to run it: the script would be stopped when the app quits.

  2. Run:

    cd /absolute/path/to/MCP-OpenIA
    ./scripts/register-claude-desktop.sh
  3. Quit Claude Desktop with Cmd+Q (closing the window isn't enough).

The script waits for the app to quit, backs up the config (claude_desktop_config.json.bak-<timestamp>), adds the openai-images entry pointing at your node and dist/index.js, and reopens Claude Desktop. If the app isn't running, it registers right away. It gives up without changing anything if the app isn't quit within 30 minutes.

Optional environment variables: NODE_BIN (node binary to register, default: the node on your PATH), MCP_NAME (default openai-images), TIMEOUT_SECONDS (default 1800).

Option B — manual

  1. Quit Claude Desktop completely (Cmd+Q).

  2. Add the entry to ~/Library/Application Support/Claude/claude_desktop_config.json, keeping everything else in the file:

    {
      "mcpServers": {
        "openai-images": {
          "command": "/usr/local/bin/node",
          "args": ["/absolute/path/to/MCP-OpenIA/dist/index.js"]
        }
      }
    }

    Use the output of which node as command — Claude Desktop doesn't load your shell's PATH, so a bare node may not be found.

  3. Open Claude Desktop again.

Verify

  1. The entry is still in the config after the app has been open for a few minutes:

    grep -A3 '"openai-images"' ~/Library/Application\ Support/Claude/claude_desktop_config.json
  2. The app launched the server — this log file exists and shows no startup errors:

    tail -n 20 ~/Library/Logs/Claude/mcp-server-openai-images.log
  3. In a new Cowork or chat session, ask Claude to run listar_modelos_imagen. It should list the image models your OpenAI key can use. Sessions that were already open when the server was registered won't see it.

Output

Every image is saved to output/YYYY-MM-DD/, and the response includes its file_path, dimensions, estimated cost, and a preview thumbnail.

To attach an image to another system, pass the file_path to a tool that uploads local files (for example, an upload_file_path tool in a Pipefy MCP server running on the same machine).

incluir_base64: true adds file_name + file_base64 to each image, but a base64-encoded image is millions of characters: MCP clients truncate large tool outputs (Claude Code's MAX_MCP_OUTPUT_TOKENS) and it fills the agent's context. Passing the file path is the recommended route.

Errors

The server never reports success without a real image. Failures return isError: true and a JSON payload with a tipo_error field:

tipo_error

Meaning

politica_contenido

OpenAI's safety system rejected the prompt (codigo, mensaje, request_id included). Retry with an adjusted prompt.

sin_saldo

The OpenAI account is out of credits or hit its spend limit. Not retryable — needs a human to top up billing.

api_openai

Any other API error (HTTP status, code, offending parameter)

validacion

Invalid parameters caught locally before calling OpenAI — nothing was spent

postproceso

The image was generated (and billed) but cropping/text failed. imagenes_originales holds the saved original so you can fix it with componer_imagen without paying again.

local

Reference download failed (e.g. expired signed URL), missing file, missing font, etc.

Cost log

Each call appends one JSON line to logs/uso.jsonl: model, size, quality, n, token usage, estimated cost in USD, duration, and output files. Prices live in src/costs.ts (checked 2026-09-13 against OpenAI's pricing page) — update them if OpenAI changes its rates.

Troubleshooting

Symptom

Cause and fix

Cowork / Claude Desktop says the tools don't exist

The entry isn't in claude_desktop_config.json (most often it was added with the app open and got overwritten). Check with the grep above and re-register with the script. Then open a new session.

The entry disappears from the config

Claude Desktop rewrote the file while running. Register again with the app quit (Option A does this for you).

Works in Claude Code but not in Claude Desktop (or vice versa)

They use separate configs — register the server in both.

mcp-server-openai-images.log shows node: not found or ENOENT

command must be an absolute path to node (which node), and args an absolute path to dist/index.js. Run npm run build if dist/ is missing.

Tools respond with "OPENAI_API_KEY no está configurada"

Create .env in the project folder with your key (see Installation), then restart the app.

tipo_error: "sin_saldo"

The OpenAI account has no credits or hit its spend limit — top up in OpenAI's billing settings.

Text overlay fails with "Fuente … no encontrada"

Add the font files to fonts/ (see Brand fonts).

Changes to the code don't show up

Run npm run build and restart the Claude app (or open a new Claude Code session) so the server process is relaunched.

Configuration

Environment variable

Default

Purpose

OPENAI_API_KEY

Required. Your OpenAI API key

OPENAI_IMAGE_MODEL

gpt-image-2

Default model (gpt-image-2, gpt-image-2.5-flare, gpt-image-2.5-sunburst, gpt-image-1.5, gpt-image-1-mini, …)

OPENAI_ORG_ID

OpenAI organization, if your key belongs to several

OUTPUT_DIR

./output

Where images are saved

LOG_FILE

./logs/uso.jsonl

Cost/usage log

FONTS_DIR

./fonts

Font files for overlay_text

Variables can go in .env (read from the project folder, not the working directory) or in the env block of your MCP client config.

Credits

Built by Go Business Inc.

Go Business Inc. helps companies transform their operations through digital automation: process-based CRM and sales pipelines, AI chatbots and agents, automated marketing journeys, customer self-service portals, business intelligence dashboards, hardware automation, and remote-work management.

Available Tools

6 tools
componer_imagenRecortar / poner texto de marca sobre una imagen existenteA

Aplica crop_to y/o overlay_text (fuentes reales de marca) sobre una imagen que ya existe — URL, ruta local o base64 — sin llamar a OpenAI (costo cero). Úsalo para ajustar el texto de un thumbnail sin regenerar, o para recomponer cuando generar_imagen/generar_variacion devolvió tipo_error 'postproceso' (usa imagenes_originales).

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesImagen de origen: ruta local, URL (incluidas URLs firmadas de Pipefy), data URL o base64.
crop_toNoRecorta/redimensiona el resultado a estas dimensiones exactas (ej. 1280x720 para thumbnail de YouTube).
overlay_textNoTexto compuesto con las fuentes reales de marca (no generado por la IA). Se aplica DESPUÉS de crop_to, así que las coordenadas son sobre la imagen final.
output_formatNoDefault: el formato de la imagen de origen.
incluir_base64NoDefault false. Si true, agrega file_name + file_base64 (compatible con upload_file_base64 de Pipefy). Ojo: una imagen en base64 pesa millones de caracteres y puede truncarse o llenar el contexto; lo recomendado es upload_file_path con el file_path devuelto.
nombre_archivoNoPrefijo para el nombre del archivo (ej. 'tema-123-linkedin'). Default: primeras palabras del prompt.
incluir_previewNoDefault true. Devuelve una miniatura (512px) para revisar el resultado visualmente.
output_compressionNoCalidad 0-100 para jpeg/webp.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations indicate a mutating operation (readOnlyHint=false), and the description confirms this by stating it applies crop and overlay. It adds valuable context beyond annotations: it explicitly notes no OpenAI call (zero cost), warns about base64 payload size/truncation, and clarifies that overlay is applied after crop. The warning about base64 and the error-handling scenario enrich behavioral understanding.

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 sentences, front-loaded with the core action and input sources, then providing use cases. Zero filler, and the cost/no-OpenAI note is efficient. It covers purpose, usage, and key constraints without redundancy.

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

Completeness4/5

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

Given 8 parameters (including nested objects) and no output schema, the description is fairly complete: it explains input types, use cases, and the special error scenario. It does not explicitly describe the return format, but parameter names like incluir_base64 and incluir_preview hint at output options. The lack of an output schema is not a gap because the description guides invocation sufficiently.

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 coverage is 100% — every parameter has a descriptive set in the input schema. The tool description does not add parameter-level information that isn't already present in the schema (e.g., the order of overlay after crop is noted in the schema's overlay_text description). Per calibration, a baseline of 3 is appropriate when the schema handles parameter documentation fully.

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

Purpose5/5

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

The description states a specific action: 'Aplica crop_to y/o overlay_text' on an existing image, and lists input sources (URL, local path, base64). It clearly distinguishes itself from siblings by emphasizing it works on existing images and does not call OpenAI, setting it apart from image generation tools.

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

Usage Guidelines5/5

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

Explicit usage scenarios are given: 'Úsalo para ajustar el texto de un thumbnail sin regenerar, o para recomponer cuando generar_imagen/generar_variacion devolvió tipo_error postproceso'. It also mentions the cost benefit ('costo cero') and references sibling tools by name, providing clear when-to-use and when-not-to-use context.

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

generar_imagenGenerar imagen (OpenAI GPT Image)A

Genera una imagen desde cero a partir de un prompt en inglés con la API de OpenAI. Guarda el archivo en disco y devuelve su ruta (file_path) para adjuntarla a Pipefy con upload_file_path. Si OpenAI rechaza el prompt o la llamada falla, devuelve error explícito (tipo_error, código, mensaje) — nunca una imagen vacía.

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoCantidad de variantes (1-10). Default 1.
sizeNocuadrada (1024x1024, default) | apaisada (1536x1024, 3:2) | vertical (1024x1536, 2:3) | auto. Con gpt-image-2+ también ANCHOxALTO libre (múltiplos de 16, proporción 1:3–3:1, ej. 1280x720 o 1536x864).
modelNoModelo de OpenAI. Default: gpt-image-2. Ej: gpt-image-2, gpt-image-2.5-flare, gpt-image-1.5, gpt-image-1-mini.
promptYesPrompt en inglés. Se envía tal cual a OpenAI (incluye aquí colores/estilo de marca).
crop_toNoRecorta/redimensiona el resultado a estas dimensiones exactas (ej. 1280x720 para thumbnail de YouTube).
qualityNolow | medium (default) | high. xhigh/max solo en gpt-image-2.5-*. Recomendado high para la imagen maestra del Tema.
backgroundNoFondo. transparent requiere output_format png o webp.
overlay_textNoTexto compuesto con las fuentes reales de marca (no generado por la IA). Se aplica DESPUÉS de crop_to, así que las coordenadas son sobre la imagen final.
output_formatNoFormato del archivo final. Default png.
incluir_base64NoDefault false. Si true, agrega file_name + file_base64 (compatible con upload_file_base64 de Pipefy). Ojo: una imagen en base64 pesa millones de caracteres y puede truncarse o llenar el contexto; lo recomendado es upload_file_path con el file_path devuelto.
nombre_archivoNoPrefijo para el nombre del archivo (ej. 'tema-123-linkedin'). Default: primeras palabras del prompt.
incluir_previewNoDefault true. Devuelve una miniatura (512px) para revisar el resultado visualmente.
output_compressionNoCalidad 0-100 para jpeg/webp.

TDQS

A4.2/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true) by disclosing concrete side effects (saves file to disk), the return contract (file_path), and the failure contract (explicit tipo_error, código, mensaje; never an empty image). This is genuinely useful behavioral context.

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

Conciseness5/5

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

Three dense, front-loaded sentences with no filler. Core purpose comes first, followed by side effect/return value and error behavior. Every sentence earns its place.

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 complex 13-parameter tool with no output schema, the description covers the primary return path and error behavior, while the rich schema descriptions cover parameter-level details. It could be more explicit about multi-image responses when n>1 or optional base64/preview fields, but it is substantially 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 baseline is 3. The description does not add significant per-parameter meaning beyond the schema; 'prompt en inglés' repeats schema info, and file_path/error details describe output, not parameters.

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

Purpose5/5

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

States a specific action ('Genera una imagen desde cero'), resource ('API de OpenAI'), and outcome (guarda el archivo y devuelve file_path). The phrase 'desde cero' distinguishes it from sibling tools like generar_variacion and componer_imagen.

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?

Provides some context ('para adjuntarla a Pipefy con upload_file_path') but never explicitly says when to use this tool vs alternatives like generar_variacion, componer_imagen, or listar_modelos_imagen. Usage is implied rather than clearly stated.

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

generar_variacionGenerar variación desde referencias (OpenAI GPT Image)A

Genera una imagen nueva a partir de 1 a 16 imágenes de referencia (endpoint de edición de OpenAI). Úsalo para derivar las piezas (Blog, LinkedIn, Instagram, YouTube, Newsletter) desde la imagen maestra del Tema y mantener consistencia visual. Acepta URLs (incluidas URLs firmadas de Pipefy), rutas locales, data URLs o base64. Con mask hace inpainting de una zona. Devuelve file_path igual que generar_imagen.

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoCantidad de variantes (1-10). Default 1.
maskNoMáscara para inpainting (URL/ruta/base64), se aplica a la primera referencia. PNG con alfa: zonas transparentes = se editan. Si no tiene alfa, el BLANCO se interpreta como zona a editar. Se redimensiona sola.
sizeNocuadrada (1024x1024, default) | apaisada (1536x1024, 3:2) | vertical (1024x1536, 2:3) | auto. Con gpt-image-2+ también ANCHOxALTO libre (múltiplos de 16, proporción 1:3–3:1, ej. 1280x720 o 1536x864).
modelNoModelo de OpenAI. Default: gpt-image-2. Ej: gpt-image-2, gpt-image-2.5-flare, gpt-image-1.5, gpt-image-1-mini.
promptYesPrompt en inglés. Se envía tal cual a OpenAI (incluye aquí colores/estilo de marca).
crop_toNoRecorta/redimensiona el resultado a estas dimensiones exactas (ej. 1280x720 para thumbnail de YouTube).
qualityNolow | medium (default) | high. xhigh/max solo en gpt-image-2.5-*. Recomendado high para la imagen maestra del Tema.
backgroundNoFondo. transparent requiere output_format png o webp.
overlay_textNoTexto compuesto con las fuentes reales de marca (no generado por la IA). Se aplica DESPUÉS de crop_to, así que las coordenadas son sobre la imagen final.
output_formatNoFormato del archivo final. Default png.
incluir_base64NoDefault false. Si true, agrega file_name + file_base64 (compatible con upload_file_base64 de Pipefy). Ojo: una imagen en base64 pesa millones de caracteres y puede truncarse o llenar el contexto; lo recomendado es upload_file_path con el file_path devuelto.
input_fidelityNoQué tanto preservar detalles de las referencias (gpt-image-1/1.5; no aplica a 1-mini). gpt-image-2 usa alta fidelidad automáticamente.
nombre_archivoNoPrefijo para el nombre del archivo (ej. 'tema-123-linkedin'). Default: primeras palabras del prompt.
incluir_previewNoDefault true. Devuelve una miniatura (512px) para revisar el resultado visualmente.
reference_imagesYes1-16 imágenes: URL pública/firmada, ruta local absoluta, data URL o base64. Máx. 50MB c/u.
output_compressionNoCalidad 0-100 para jpeg/webp.

TDQS

A4.2/5.0
Behavior4/5

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

readOnlyHint=false already signals mutation; the description adds that input can be Pipefy-signed URLs, local paths, data URLs or base64, and that 'mask' performs inpainting. It also anchors the output expectation by saying it 'Devuelve file_path igual que generar_imagen.' No contradiction with annotations.

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

Conciseness5/5

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

Three short, information-dense sentences: action first, use case second, input/output constraints last. No filler or repeated schema boilerplate beyond one useful summary of accepted sources.

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

Completeness4/5

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

Given 16 parameters and no output schema, the description covers tool selection, input formats, inpainting capability, and the key output field. Rich parameter descriptions supply the rest; only an explicit return-shape listing and clear alternatives would make it fully 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?

All 16 parameters are documented at 100% schema coverage with defaults, enums, and constraints, so the baseline is 3. The prose repeats high-level input kinds and inpainting rather than adding new per-parameter semantics, with only the Pipefy-signed URL note being extra context.

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

Purpose5/5

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

States a specific verb and resource: 'Genera una imagen nueva a partir de 1 a 16 imágenes de referencia' and identifies the OpenAI edit endpoint. It separates the tool from 'generar_imagen' by the central role of reference images and even points to the same return contract.

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?

Explicitly says 'Úsalo para derivar las piezas... desde la imagen maestra del Tema', giving a concrete when-to-use scenario. It does not list when-not cases or name alternatives like 'componer_imagen', so it stops 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.

instalar_fuente_googleInstalar fuente de Google FontsA

Descarga e instala una familia tipográfica desde el repositorio oficial de Google Fonts para usarla en overlay_text. USAR SOLO cuando el usuario pida explícitamente instalar o usar una fuente concreta. Nunca la instales por iniciativa propia ni para cambiar la tipografía de marca (Manrope/Inter) sin que el usuario lo pida. Solo Google Fonts; las fuentes comerciales hay que instalarlas a mano. Después de instalarla, usa el nombre de 'familia' en fontFamily.

ParametersJSON Schema
NameRequiredDescriptionDefault
familiaYesNombre de la familia tal como aparece en fonts.google.com, ej. 'Playfair Display'.

TDQS

A4.7/5.0
Behavior4/5

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

Las anotaciones indican readOnlyHint=false y openWorldHint=true, pero la descripción aporta contexto útil: herramienta muta el estado al instalar la fuente, fuente proviene del repo oficial de Google Fonts, y la instalación persiste para uso en overlay_text. No detalla posibles efectos secundarios o requerimientos de permisos, pero con anotaciones presentes el gap es menor.

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?

La descripción es compacta y está bien distribida: propósuta al frente, restricciones de uso, restricciones de fuente y nota de aplicación. Cada oración aporta información necesaria, sin repetir el schema ni las anotaciones.

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?

Para un tool con un solo parámetro y unas pocas reglas de uso, la descripción cubre todos los puntos relevantes: qué hacer, cuándo usar, de dónde sacar la fuente, qué restricciones aplicar y cómo usar el resultado. No exige output schema ni documentación adicional.

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?

El esquema ya tiene 100% de cobertura y define la familia claramente ('Nombre de la familia tal como aparece en fonts.google.com'). La descripción agrega la conexión de que la instalación debe usarse con 'fontFamily', transformando el parámetro en una instrucción aplicable. Esto supera el baseline de 3.

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

Purpose5/5

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

La descripción declara explícitemente la acción (descargar e instalar), el recurso (familia tipográfica del repositorio oficial de Google Fonts) y el contexto de uso (overlay_text). Esto diferencia el tool de los siblings mencionados (generar_imagen, componer_imagen, etc.) sin ambigüedad.

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

Usage Guidelines5/5

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

Proporciona reglas claras: usarlo solo cuando el usuario pida explícitamente instalar o usar una fuente, nunca por iniciativa propia ni para cambiar fuentes de marca (Manrope/Inter) sin pedido. Además establece un límite de fuente (solo Google Fonts) e indica qué hacer después de instalar (usar nombre de familia en fontFamily).

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

listar_modelos_imagenListar modelos de imagen disponiblesA
Read-only

Lista los modelos de imagen de OpenAI a los que tiene acceso la API key configurada. Sirve también como prueba de conexión.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds useful behavioral context: it depends on the configured API key and can act as a connectivity check. No contradiction exists between the description and annotations.

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

Conciseness5/5

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

Two short sentences carry exactly the needed information: the primary purpose and the secondary connection-test use. It is front-loaded and contains no 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 zero-parameter, read-only list tool with no output schema, the description covers the main purpose and an additional use case. It could mention the output shape, but the absence is minor given the simplicity of the operation.

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

Parameters4/5

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

The tool has zero parameters and 100% schema description coverage, so the baseline is 4. The description adds no parameter details because none are needed.

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 a specific verb ('Lista') and resource ('modelos de imagen de OpenAI') and clarifies the exact scope: models accessible to the configured API key. This clearly distinguishes it from sibling tools like generar_imagen or componer_imagen, which perform different operations.

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

Usage Guidelines4/5

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

The description provides clear context by stating it lists accessible image models and also serves as a connection test. It does not explicitly name alternatives or exclusions, but the tool's simple role and distinct siblings make the intended usage obvious.

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

resumen_gastoResumen de gasto en OpenAIA
Read-only

Resume las llamadas y el costo estimado registrados en el log local, agrupado por modelo.

ParametersJSON Schema
NameRequiredDescriptionDefault
diasNoVentana en días. Default 30.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the agent knows this is a safe read operation. The description adds that it reads from a 'log local' and groups by model, which is useful context. However, it doesn't disclose details like whether the cost is estimated or actual, or how the log is maintained. With annotations covering the safety profile, a 3 is appropriate.

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, concise sentence that front-loads the main action and resource. It includes the key grouping detail ('agrupado por modelo') without any waste. Every word earns its place.

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 simple read-only tool with one optional parameter and no output schema, the description is nearly complete. It tells the agent what the tool does, what it reads, and how it groups results. The only minor gap is that it doesn't describe the return format, but since there's no output schema, a brief note on what the summary looks like could help. However, given the simplicity, this is a minor gap.

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 coverage is 100%, so the schema already documents the 'dias' parameter with its range and default. The description doesn't add any additional meaning beyond what the schema provides. Baseline 3 is correct when schema does the heavy lifting.

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 clearly states the tool's function: summarizing calls and estimated cost from the local log, grouped by model. It uses a specific verb ('Resume') and resource ('llamadas y el costo estimado... log local'), which distinguishes it from the sibling image-generation tools. However, it doesn't explicitly differentiate from any potential sibling that might also summarize logs, but given the sibling list, it's clear enough.

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

Usage Guidelines3/5

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

The description implies usage context: it's for reviewing call and cost summaries from the local log. It doesn't explicitly state when to use it vs alternatives, but the sibling tools are all image-related, so the context is clear. No exclusions or alternative conditions are provided, but the tool's purpose is straightforward enough that an agent can infer when to use it.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv1.0.0
    • First observedcomponer_imagen
    • First observedgenerar_imagen
    • First observedgenerar_variacion
    • First observedinstalar_fuente_google
    • First observedlistar_modelos_imagen
    • First observedresumen_gasto

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation5/5

Every tool targets a distinct operation: generation from prompt, variation from references, composition via crop/overlay, font installation, model listing, and expense summary. The two 'generar' tools are clearly differentiated by input type and purpose, so there's no ambiguity.

Naming Consistency4/5

Most tools follow a verb_noun pattern (generar_imagen, generar_variacion, componer_imagen, instalar_fuente_google, listar_modelos_imagen), but 'resumen_gasto' is a noun phrase rather than a verb. This single deviation prevents a perfect score.

Tool Count5/5

With 6 tools, the server is well-scoped for an image generation workflow. Each tool has a clear role, and the count feels neither sparse nor overwhelming — it's a tight, purposeful set.

Completeness5/5

The surface covers the core image lifecycle: creation, variation, editing, styling, model discovery, and cost tracking. There are no obvious dead ends or missing operations for the stated domain of OpenAI image generation.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers