MCP OpenAI Images
Downloads font families from the official Google Fonts repository and makes them available for rendering text overlays on images.
Generates and edits images using the OpenAI Images API, including image generation from text prompts, variations from reference images, inpainting with masks, and configurable output sizes, qualities, and formats.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP OpenAI ImagesGenerate a square image for Instagram and overlay 'Summer Sale' in our brand font"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Generates an image from a text prompt | OpenAI |
| Generates a new image from 1–16 reference images (URL — including signed URLs —, local path, data URL, or base64), with an optional | OpenAI |
| Applies | Free |
| Downloads a font family from the official Google Fonts repository into | Free |
| Lists the image models your API key can use (also a connection test) | Free |
| 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 sent verbatim to OpenAI (English recommended) |
|
|
|
|
|
|
| Number of variants (1–10) |
| Overrides the default model for this call |
|
|
|
|
| Array of |
| Filename prefix |
| Also return |
| Return a 512px thumbnail so the agent can review the result (default |
Post-processing order: OpenAI image → crop_to → overlay_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 .envPut 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.jsThen 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.
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.
Option A — registration script (recommended)
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.
Run:
cd /absolute/path/to/MCP-OpenIA ./scripts/register-claude-desktop.shQuit 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
Quit Claude Desktop completely (Cmd+Q).
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 nodeascommand— Claude Desktop doesn't load your shell'sPATH, so a barenodemay not be found.Open Claude Desktop again.
Verify
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.jsonThe app launched the server — this log file exists and shows no startup errors:
tail -n 20 ~/Library/Logs/Claude/mcp-server-openai-images.logIn 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:
| Meaning |
| OpenAI's safety system rejected the prompt ( |
| The OpenAI account is out of credits or hit its spend limit. Not retryable — needs a human to top up billing. |
| Any other API error (HTTP status, code, offending parameter) |
| Invalid parameters caught locally before calling OpenAI — nothing was spent |
| The image was generated (and billed) but cropping/text failed. |
| 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 |
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. |
|
|
Tools respond with "OPENAI_API_KEY no está configurada" | Create |
| 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 |
Changes to the code don't show up | Run |
Configuration
Environment variable | Default | Purpose |
| — | Required. Your OpenAI API key |
|
| Default model ( |
| — | OpenAI organization, if your key belongs to several |
|
| Where images are saved |
|
| Cost/usage log |
|
| Font files for |
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 toolscomponer_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).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Imagen de origen: ruta local, URL (incluidas URLs firmadas de Pipefy), data URL o base64. | |
| crop_to | No | Recorta/redimensiona el resultado a estas dimensiones exactas (ej. 1280x720 para thumbnail de YouTube). | |
| overlay_text | No | Texto 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_format | No | Default: el formato de la imagen de origen. | |
| incluir_base64 | No | Default 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_archivo | No | Prefijo para el nombre del archivo (ej. 'tema-123-linkedin'). Default: primeras palabras del prompt. | |
| incluir_preview | No | Default true. Devuelve una miniatura (512px) para revisar el resultado visualmente. | |
| output_compression | No | Calidad 0-100 para jpeg/webp. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Cantidad de variantes (1-10). Default 1. | |
| size | No | cuadrada (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). | |
| model | No | Modelo de OpenAI. Default: gpt-image-2. Ej: gpt-image-2, gpt-image-2.5-flare, gpt-image-1.5, gpt-image-1-mini. | |
| prompt | Yes | Prompt en inglés. Se envía tal cual a OpenAI (incluye aquí colores/estilo de marca). | |
| crop_to | No | Recorta/redimensiona el resultado a estas dimensiones exactas (ej. 1280x720 para thumbnail de YouTube). | |
| quality | No | low | medium (default) | high. xhigh/max solo en gpt-image-2.5-*. Recomendado high para la imagen maestra del Tema. | |
| background | No | Fondo. transparent requiere output_format png o webp. | |
| overlay_text | No | Texto 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_format | No | Formato del archivo final. Default png. | |
| incluir_base64 | No | Default 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_archivo | No | Prefijo para el nombre del archivo (ej. 'tema-123-linkedin'). Default: primeras palabras del prompt. | |
| incluir_preview | No | Default true. Devuelve una miniatura (512px) para revisar el resultado visualmente. | |
| output_compression | No | Calidad 0-100 para jpeg/webp. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Cantidad de variantes (1-10). Default 1. | |
| mask | No | Má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. | |
| size | No | cuadrada (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). | |
| model | No | Modelo de OpenAI. Default: gpt-image-2. Ej: gpt-image-2, gpt-image-2.5-flare, gpt-image-1.5, gpt-image-1-mini. | |
| prompt | Yes | Prompt en inglés. Se envía tal cual a OpenAI (incluye aquí colores/estilo de marca). | |
| crop_to | No | Recorta/redimensiona el resultado a estas dimensiones exactas (ej. 1280x720 para thumbnail de YouTube). | |
| quality | No | low | medium (default) | high. xhigh/max solo en gpt-image-2.5-*. Recomendado high para la imagen maestra del Tema. | |
| background | No | Fondo. transparent requiere output_format png o webp. | |
| overlay_text | No | Texto 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_format | No | Formato del archivo final. Default png. | |
| incluir_base64 | No | Default 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_fidelity | No | Qué 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_archivo | No | Prefijo para el nombre del archivo (ej. 'tema-123-linkedin'). Default: primeras palabras del prompt. | |
| incluir_preview | No | Default true. Devuelve una miniatura (512px) para revisar el resultado visualmente. | |
| reference_images | Yes | 1-16 imágenes: URL pública/firmada, ruta local absoluta, data URL o base64. Máx. 50MB c/u. | |
| output_compression | No | Calidad 0-100 para jpeg/webp. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| familia | Yes | Nombre de la familia tal como aparece en fonts.google.com, ej. 'Playfair Display'. |
TDQS
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.
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.
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.
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.
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.
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 disponiblesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 OpenAIARead-only
Resume las llamadas y el costo estimado registrados en el log local, agrupado por modelo.
| Name | Required | Description | Default |
|---|---|---|---|
| dias | No | Ventana en días. Default 30. |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v1.0.0- First observed
componer_imagen - First observed
generar_imagen - First observed
generar_variacion - First observed
instalar_fuente_google - First observed
listar_modelos_imagen - First observed
resumen_gasto
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
Focused MCP server for OpenAI image/audio generation (v2.0.0). Wraps endpoints via HAPI CLI.
MCP server for Qwen Image 3 AI image generation
Generate AI images and videos from any compatible MCP client.
MCP server for NanoBanana AI image generation and editing
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceAn MCP server that enables text-to-image generation and editing using OpenAI's gpt-image-1 model, supporting multiple output formats, quality settings, and background options.69-
- AlicenseBqualityDmaintenanceA local MCP server for generating and editing images using OpenAI-compatible APIs. It provides text-to-image generation and image editing capabilities with configurable endpoints and saves output directly to local files.211 npmMIT
- AlicenseNot gradedqualityDmaintenanceMCP server that wraps OpenAI's image generation and editing APIs, enabling text-to-image and image-to-image operations via tools.139 npm37ISC
- AlicenseAqualityDmaintenanceAn MCP server that generates and edits images using OpenAI's GPT Image model, allowing users to create images from text descriptions and edit existing images through natural language.17 npmMIT